10

Tôi có một chương trình xem đầu vào máy ảnh trong thời gian thực và nhận được giá trị màu của pixel giữa. Tôi sử dụng một captureOutput: Phương pháp để lấy CMSampleBuffer từ một đầu ra AVCaptureSession (mà xảy ra để được đọc như một CVPixelBuffer) và sau đó tôi lấy các giá trị rgb của một điểm ảnh bằng cách sử dụng đoạn mã sau:Lấy dữ liệu mong muốn từ Tham chiếu 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)]; 

tôi mặc dù công thức ((chiều rộng * chiều cao) * 4)/2 sẽ cho tôi điểm ảnh giữa, nhưng nó mang lại cho tôi điểm ảnh giữa trên cùng của hình ảnh. Tôi tự hỏi tôi sẽ cần sử dụng công thức nào để truy cập pixel ở giữa màn hình. Tôi bị kẹt vì tôi không thực sự biết cấu trúc bên trong của các bộ đệm pixel này.

Trong tương lai, tôi muốn lấy 4 pixel giữa và trung bình chúng để đọc màu chính xác hơn, nhưng bây giờ tôi chỉ muốn có ý tưởng về cách những thứ này hoạt động.

Trả lời

4

Vấn đề chính với công thức của bạn để xác định vị trí điểm giữa là nó chỉ hoạt động với số lượng quét không đồng đều. Nếu bạn có số chẵn, nó sẽ chọn điểm ảnh đầu tiên trên vạch quét ngay dưới chính giữa. Đó là điểm ảnh giữa bên trái. Vì khung hình video của iPhone được xoay 90 độ, điểm ảnh này thực tế là điểm ảnh ở giữa trên cùng.

Vì vậy, một công thức tốt hơn để định vị pixel giữa là:

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

Vâng, phương hướng mặc định cho hai máy ảnh trên các thiết bị iOS là cảnh quan, vì vậy nếu bạn đang làm bất cứ công việc chân dung-mode bạn' sẽ cần phải đối phó với một khung xoay. –

+0

@Codo có lời khuyên nào không? http://stackoverflow.com/questions/37611593/how-to-create-cvpixelbufferref-with-yuv420i420-data –

+0

Tò mò, tại sao phần chiều rộng được nhân với 4? – OutOnAWeekend

Các vấn đề liên quan