iOS: получить попиксельные данные с камеры

Я знаю об AVFoundation и его поддержке захвата (хотя и не слишком знакомо). Однако я не вижу легкодоступного API для получения попиксельных данных (RGB-на-пиксель или аналогичных). Я помню, как читал в документации, что это возможно, но я не понимаю, как это сделать. Так:

  1. Можно ли это сделать? Если так, то как?
  2. Получу ли я необработанные данные изображения или данные, сжатые в формате 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);
 }
Другие вопросы по тегам