10

Mam program, który wyświetla dane z kamery w czasie rzeczywistym i pobiera wartość koloru środkowego piksela. Używać captureOutput: sposób chwycić CMSampleBuffer z wyjścia AVCaptureSession (co dzieje się rozumieć jako CVPixelBuffer), a potem chwycić RGB piksela z zastosowaniem kodu:Uzyskiwanie danych z CVPixelBuffer Reference

// 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)]; 

że mimo tego wzoru ((szerokość * wysokość) * 4)/2 dałoby mi środkowy piksel, ale daje mi najwyższy środkowy piksel obrazu. Zastanawiam się, jaką formułę powinienem użyć, aby uzyskać dostęp do piksela na środku ekranu. Trochę utknąłem, ponieważ tak naprawdę nie znam wewnętrznej struktury tych buforów pikseli.

W przyszłości chciałbym pobrać 4 środkowe piksele i uśrednić je w celu dokładniejszego odczytywania kolorów, ale na razie chciałbym się dowiedzieć, jak te rzeczy działają.

Odpowiedz

4

Głównym problemem związanym z lokalizacją środkowego piksela jest to, że działa on tylko dla nierównomiernej liczby linii skanowania. Jeśli masz parzystą liczbę, wybiera pierwszy piksel na linii skanowania tuż poniżej środka. To środkowy lewy piksel. Ponieważ klatki wideo iPhone'a są obrócone o 90 stopni, piksel ten jest w rzeczywistości pikselem najwyższej połowy.

Więc lepszy wzór do lokalizowania środkowy piksel jest:

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

Tak, orientacje domyślne dla dwóch kamer na urządzeniach z iOS jest krajobraz, więc jeśli robisz jakichkolwiek prac portret trybu you” Muszę poradzić sobie z obróconą ramą. –

+0

@Codo jakiejkolwiek porady? http://stackoverflow.com/questions/37611593/how-to-create-cvpixelbufferref-with-yuv420i420-data –

+0

Ciekawe, dlaczego część szerokości jest pomnożona przez 4? – OutOnAWeekend