1

ImageReader.OnImageAvailableListener를 사용하여 프레임 버퍼를 검색하여 최신 이미지를 가져 와서 Y 평면을 처리하는 간단한 Android 애플리케이션을 작성했습니다. 이 비행기를 사용하여 화면에 무언가를 표시할지 여부를 결정하는 간단한 측정 항목을 계산합니다.Android Camera2 YUV_420_888 Y 채널 해석

제 질문은 Y 평면 만 처리하고 해석하는 방법이었습니다 (저는 U 평면과 V 평면이 필요 없습니다). Y 평면에 휘도 채널이 포함되어 있다는 것을 이해해야합니다. 즉. 이미지의 밝기와 채널.

문서는 각 픽셀이 8 비트, 즉 1 바이트라고 말합니다. 픽셀은 ByteBuffer에 있기 때문에 의미가 있습니다. 그러나 Y 채널의 첫 번째 바이트를 인쇄 한 일부 실험 (필자는 ImageReader.OnImageAvailableListener에서 Log.i(TAG, String.valueOf(image.getPlanes()[0].getBuffer().get(0)을 호출하여이 작업을 수행함) 이미지 "밝기"와 바이트 값 사이의 상관 관계를 보지 못했습니다. 예를 들어 카메라를 완전히 검정색 배경에 놓았을 때 휘도가 ~ 0에서 15 사이의 값을 얻습니다. 밝은 흰색 배경에 놓으면 -110 주위에 값이 생깁니다. 그러나 이것들은 어떤 종류의 미니 마나 맥시마가 아닙니다. 나는 모든 백색이 아닌 또는 완전히 검정색 일 때 휘도와 상관 관계가없는 것처럼 보이는 값을 얻을 것이다.

내 질문은 어떻게 이러한 휘도 값을 해석해야하며 어떤 방식 으로든 특정 픽셀의 이미지 밝기와 상관 관계가있는 것입니다. 프레임 버퍼의 휘도 값을 올바르게 검색하고, 그렇지 않은 경우 어떻게 검색해야합니까?

+0

관련 항목 : http://stackoverflow.com/questions/22793155/difference-between-yuv420-and-yuv422 –

답변

0

나는 손으로 짜내는 것을 마침내 알아 냈다 : 나는 대답의 열쇠를 this 링크에서 우연히 발견했다. 보고되는 값은 실제로는 휘도 값이지만, 배치 된 ByteBuffer는 SIGNED이며 휘도 값은 UNSIGNED입니다 (링크에보고 됨). 따라서 버퍼의 각 값은 실제 밝기 값을 검색하기 위해 0xff으로 & -ed가되어야하며, 이번에는 의미가 있습니다.