iOS: получить попиксельные данные с камеры
Я знаю об AVFoundation и его поддержке захвата (хотя и не слишком знакомо). Однако я не вижу легкодоступного API для получения попиксельных данных (RGB-на-пиксель или аналогичных). Я помню, как читал в документации, что это возможно, но я не понимаю, как это сделать. Так:
- Можно ли это сделать? Если так, то как?
- Получу ли я необработанные данные изображения или данные, сжатые в формате JPEG?
2 ответа
AV Foundation может вернуть вам необработанные байты для изображения, снятого видео или фотоаппаратом. Вам необходимо настроить AVCaptureSession с соответствующим AVCaptureDevice и соответствующими AVCaptureDeviceInput и AVCaptureDeviceOutput (AVCaptureVideoDataOutput или AVCaptureStillImageOutput). Apple имеет несколько примеров этого процесса в своей документации, и для настройки требуется некоторый шаблонный код.
После настройки сеанса захвата и захвата данных с камеры вы настроите -captureOutput:didOutputSampleBuffer:fromConnection:
метод делегата, где одним из параметров будет CMSampleBufferRef. Это будет иметь CVImageBufferRef внутри него, к которому вы получаете доступ через CMSampleBufferGetImageBuffer()
, С помощью CVPixelBufferGetBaseAddress()
в этом пиксельном буфере будет возвращаться базовый адрес байтового массива для необработанных пиксельных данных, представляющих кадр вашей камеры. Это может быть в нескольких разных форматах, но наиболее распространенными являются BGRA и планарная YUV.
У меня есть пример приложения, которое использует это здесь, но я бы порекомендовал вам взглянуть на мою среду с открытым исходным кодом, которая оборачивает стандартный шаблон AV Foundation и облегчает выполнение обработки изображений на графическом процессоре. В зависимости от того, что вы хотите сделать с этими необработанными байтами камеры, у меня уже может быть кое-что, что вы можете использовать там, или средство сделать это намного быстрее, чем при обработке на процессоре.
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);
}