iOS: uzyskaj piksel po pikselu dane z aparatu

Jestem świadomy AVFoundation i jego obsługi przechwytywania (choć niezbyt znane). Jednak nie widzę żadnego łatwo dostępnego API, aby uzyskać dane piksel po pikselu (RGB na piksel lub podobne). Pamiętam, że czytałem w dokumentach, że jest to możliwe, ale naprawdę nie widzę jak. Więc:

    Czy Można to zrobić? Jeśli tak, to w jaki sposób?
  1. Czy dostanę surowe dane obrazu, czy dane, które zostały skompresowane JPEG?
Author: FeifanZ, 2012-06-02

2 answers

Av Foundation może zwrócić surowe bajty dla obrazu przechwyconego przez kamerę wideo lub nieruchomą. Musisz skonfigurować Avcapturession z odpowiednim AVCaptureDevice i odpowiednimi AVCaptureDeviceInput i AVCaptureDeviceOutput (AVCaptureVideoDataOutput lub Avcapturtillimageoutput). Apple ma kilka przykładów tego procesu w swojej dokumentacji i wymaga kodu boilerplate do skonfigurowania.

Po skonfigurowaniu sesji przechwytywania i przechwytywanie danych z kamery, skonfigurujesz metodę -captureOutput:didOutputSampleBuffer:fromConnection: delegate, gdzie jednym z parametrów będzie CMSampleBufferRef. Który będzie miał w sobie Cvimagebuferref, do którego uzyskasz dostęp poprzez CMSampleBufferGetImageBuffer(). Użycie CVPixelBufferGetBaseAddress() na tym buforze pikseli zwróci adres bazowy tablicy bajtów dla nieprzetworzonych danych pikseli reprezentujących ramkę aparatu. Może to być w kilku różnych formatach, ale najczęściej są BGRA i planar YUV.

Mam przykładową aplikację, która używa tego tutaj , ale Polecam również spojrzeć na mój open source framework , który owija standardową płytę AV Foundation boilerplate i ułatwia przetwarzanie obrazu na GPU. W zależności od tego, co chcesz zrobić z tymi surowymi bajtami kamery, mogę już mieć coś, czego możesz tam użyć lub sposób na zrobienie tego znacznie szybciej niż w przypadku przetwarzania na procesorze.

 31
Author: Brad Larson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-02 19:20:47
 lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
 float luminance = dot(textureColor.rgb, W);

 mediump vec2 p = textureCoordinate;
 if (p.x == 0.2 && p.x<0.6 && p.y > 0.4 && p.y<0.6) {
     gl_FragColor = vec4(textureColor.r * 1.0, textureColor.g * 1.0, textureColor.b * 1.0, textureColor.a);
 } else {
   gl_FragColor = vec4(textureColor.r * 0.0, textureColor.g * 0.0, textureColor.b * 0.0, textureColor.a *0.0);
 }
 -4
Author: ram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-09 12:47:42