10

Ich habe ein Programm, das einen Kameraeingang in Echtzeit anzeigt und den Farbwert des mittleren Pixels ermittelt. Ich benutze eine captureOutput: Methode die CMSampleBuffer von einem AVCaptureSession Ausgang zu greifen (die als CVPixelBuffer zu lesenden geschieht), und dann greifen I den RGB-Wert eines Pixels mit dem folgenden Code:Ermitteln der gewünschten Daten von einem CVPixelBuffer Referenz

// 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 obwohl diese Formel ((width * height) * 4)/2 würde mir das mittlere Pixel bringen, aber es gibt mir den oberen mittleren Pixel des Bildes. Ich frage mich, welche Formel ich verwenden müsste, um auf das Pixel in der Mitte des Bildschirms zuzugreifen. Ich stecke irgendwie fest, weil ich die interne Struktur dieser Pixelpuffer nicht wirklich kenne.

In der Zukunft möchte ich die 4 mittleren Pixel greifen und sie für ein genaueres Farblesen durchschnittlich, aber für jetzt möchte ich nur eine Idee bekommen, wie diese Dinge funktionieren.

Antwort

4

Das Hauptproblem mit Ihrer Formel zum Lokalisieren des mittleren Pixels ist, dass es nur für eine ungerade Anzahl von Scanlinien funktioniert. Wenn Sie eine gerade Zahl haben, wählt sie das erste Pixel auf der Scanlinie direkt unter der Mitte aus. Das ist das mittlere linke Pixel. Da die iPhone-Videorahmen um 90 Grad gedreht sind, ist dieser Pixel in Wirklichkeit der obere mittlere Pixel.

So eine bessere Formel für das mittlere Pixel Ortung ist:

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

Ja, die Standard-Orientierungen für die beiden Kameras auf den iOS-Geräten ist die Landschaft, so dass, wenn Sie irgendeine Portrait-Modus Arbeit sind Sie‘ Ich muss mit einem gedrehten Rahmen umgehen. –

+0

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

+0

Neugierig, warum ist die Breite Teil mit 4 multipliziert? – OutOnAWeekend

Verwandte Themen