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?
- Czy dostanę surowe dane obrazu, czy dane, które zostały skompresowane JPEG?
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.
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);
}
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