10

카메라 입력을 실시간으로보고 중간 픽셀의 색상 값을 가져 오는 프로그램이 있습니다.CVPixelBuffer에서 원하는 데이터 가져 오기 참조

// Get a CMSampleBuffer's Core Video image buffer for the media data 
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
// Lock the base address of the pixel buffer 
CVPixelBufferLockBaseAddress(imageBuffer, 0); 

// Get the number of bytes per row for the pixel buffer 
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
// Get the pixel buffer width and height 
size_t width = CVPixelBufferGetWidth(imageBuffer); 
size_t height = CVPixelBufferGetHeight(imageBuffer); 
unsigned char* pixel = (unsigned char *)CVPixelBufferGetBaseAddress(imageBuffer); 

NSLog(@"Middle pixel: %hhu", pixel[((width*height)*4)/2]); 
int red = pixel[(((width*height)*4)/2)+2]; 
int green = pixel[(((width*height)*4)/2)+1]; 
int blue = pixel[((width*height)*4)/2]; 
int alpha = 1; 

UIColor *color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha)]; 

I이 화학식 비록 : 다음 I는 다음과 같은 코드를 사용하여 화소의 RGB 값을 잡아 (a CVPixelBuffer으로 판독하는 일)이 AVCaptureSession 출력에서 ​​CMSampleBuffer 잡아 방법 I은 captureOutput를 사용 ((width * height) * 4)/2는 중간 픽셀을 얻지 만 이미지의 중간 중간 픽셀을 제공합니다. 화면 중간의 픽셀에 액세스하기 위해 어떤 수식을 사용해야하는지 궁금합니다. 이 픽셀 버퍼의 내부 구조를 실제로 알지 못하기 때문에 다소 고생했습니다.

미래에는 4 개의 중간 픽셀을 잡고 더 정확한 색상 판독 값을 얻고 싶습니다. 그러나 지금은 이러한 것들이 어떻게 작동하는지 알고 싶습니다.

답변

4

가운데 픽셀을 찾는 수식의 주요 문제점은 고르지 않은 수의 주사선에서만 작동한다는 것입니다. 짝수가 있으면 중간 바로 아래의 스캔 라인에서 첫 번째 픽셀을 선택합니다. 그것은 가운데 왼쪽 픽셀입니다. iPhone 비디오 프레임이 90도 회전 되었기 때문에이 픽셀은 실제로 상단 중간 픽셀입니다.

그래서 중간 픽셀의 위치를위한 더 나은 공식은 다음과 같습니다

(height/2) * bytesPerRow + (width/2) * 4 
+0

예, 당신이 어떤 세로 모드 작업을하고 그래서 만약 아이폰 OS 장치에있는 두 개의 카메라의 기본 방향은 가로 당신 ' 회전 된 프레임을 처리해야합니다. –

+0

@Codo 어떤 조언이 있으십니까? http://stackoverflow.com/questions/37611593/how-to-create-cvpixelbufferref-with-yuv420i420-data –

+0

호기심, 왜 너비 부분에 4가 곱해지고 있습니까? – OutOnAWeekend