Вопрос по frameworks, opencv, ios – видеообработка в открытом формате ios

4

Я пытаюсь сделать учебник найденнымВот для обработки видео IOS с OpenCV Framework.

Я успешно загрузил платформу ios openCv в свой проект -but Похоже, что между моей структурой и той, что представлена в руководстве, есть несоответствие, и я надеюсь, что кто-то может мне помочь.

OpenCv используетcv::Mat тип для представления изображений. При использовании делегирования AVfoundation для обработки изображений с камеры - мне нужно будет преобразовать всеCMSampleBufferRef к этому типу.

Похоже, что фреймворк openCV, представленный в руководстве, предоставляет библиотеку, называемую

#import <opencv2/highgui/cap_ios.h>

с новой командой делегата:

Может кто-нибудь указать мне, где я могу найти эту структуру или, возможно, быстрое преобразование междуCMSampleBufferRef а такжеcv::Mat

EDIT

Существует много сегментации в среде opencv (по крайней мере, для ios). Я загрузил его через различные "официальные" сообщения. сайты, а также с помощью таких инструментов, как fink и brew, используя свои инструкции. Я даже сравнил заголовочные файлы, которые были установлены в / usr / local / include / opencv /. Они были разные каждый раз. При загрузке проекта openCV - в одном проекте находятся различные файлы cmake и конфликтующие файлы readme. Я думаю, что мне удалось создать хорошую версию для IOS с функциональностью avcapture, встроенной в платформу (с этим заголовком<opencv2/highgui/cap_ios.h>) сквозь этоссылка на сайт  а затем сборка библиотеки с использованием скрипта Python в каталоге IOS - с помощью командыpython opencv/ios/build_framework.py ios, Я постараюсь обновить

Ваш Ответ

2   ответа
13

которое я использую. Вы блокируете пиксельный буфер, создаете cv :: Mat, обрабатываете cv :: Mat, затем разблокируете пиксельный буфер.

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

CVPixelBufferLockBaseAddress( pixelBuffer, 0 );

int bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
int bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
int bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer);
unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);
cv::Mat image = cv::Mat(bufferHeight,bufferWidth,CV_8UC4,pixel, bytesPerRow); //put buffer in open cv, no memory copied
//Processing here

//End processing
CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );
}

Вышеупомянутый метод не копирует какую-либо память, и, таким образом, у вас нет этой памяти, pixelBuffer освободит ее для вас. Если вы хотите свою собственную копию буфера, просто сделайте

cv::Mat copied_image = image.clone();
спасибо за информацию, обновил мой ответ
Следующий код не будет работать, по крайней мере, на iPhone 6 и iPhone6 + с iOS 10.2, которую я протестировал, потому что базовый массив пикселей не является непрерывным в памяти. Пожалуйста, смотрите мой обновленный ответ ниже.
откуда берется pixelBuffer? у вас есть какой-нибудь код, чтобы отсылать меня к использованию avfoundation и openCV с делегатом captureOutput: didOutputSampleBuffer: fromConnection: Avner Barr
@AvnerBarr см обновленный ответ
5

которая должна работать с любым устройством iOS.

посколькуbufferWidth не равноbytePerRow по крайней мере, на iPhone 6 и iPhone 6+ нам нужно указать количество байтов в каждой строке в качестве последнего аргумента конструктора cv :: Mat.

CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

CVPixelBufferLockBaseAddress(pixelBuffer, 0);

int bufferWidth = CVPixelBufferGetWidth(pixelBuffer);
int bufferHeight = CVPixelBufferGetHeight(pixelBuffer);
int bytePerRow = CVPixelBufferGetBytesPerRow(pixelBuffer);
unsigned char *pixel = (unsigned char *) CVPixelBufferGetBaseAddress(pixelBuffer);
cv::Mat image = cv::Mat(bufferHeight, bufferWidth, CV_8UC4, pixel, bytePerRow); 

// Process you cv::Mat here

CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);

Код был протестирован на моем iPhone5, iPhone6 и iPhone6 + под управлением iOS 10.

Спасибо за информацию (+1), я обновил свой ответ

Похожие вопросы