打开cv ios视频​​处理

Avn*_*arr 4 opencv frameworks ios

我想做发现教程在这里与OpenCV的框架ios的视频处理.

我已成功将ios openCv框架加载到我的项目中 - 我的框架与教程中提供的框架之间似乎存在不匹配,我希望有人可以帮助我.

OpenCv使用cv::Mat类型来表示图像.当使用AVfoundation委托来处理来自相机的图像时 - 我需要将所有内容转换CMSampleBufferRef为该类型.

看来教程中提供的openCV框架提供了一个名为using的库

#import <opencv2/highgui/cap_ios.h>
Run Code Online (Sandbox Code Playgroud)

使用新的委托命令:

任何人都可以指出我在哪里可以找到这个框架或者可能在CMSampleBufferRef和之间快速转换cv::Mat

编辑

opencv框架中有很多细分(至少对于ios).我已经通过各种"官方"网站下载了它,并使用他们的说明使用fink和brew等工具.我甚至比较了安装到/ usr/local/include/opencv /的头文件.他们每次都不同.下载openCV项目时 - 同一个项目中有各种cmake文件和冲突的自述文件.我认为我成功地为IOS构建了一个好的版本,<opencv2/highgui/cap_ios.h>通过此链接内置了框架(使用此标头)的avcapture功能 ,然后使用命令在ios目录中使用python脚本构建库python opencv/ios/build_framework.py ios.我会尝试更新

Ham*_*mer 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 );
}
Run Code Online (Sandbox Code Playgroud)

上面的方法不会复制任何内存,因此你不拥有内存,pixelBuffer会为你释放它.如果你想要自己的缓冲区副本,那就行了

cv::Mat copied_image = image.clone();
Run Code Online (Sandbox Code Playgroud)


Nun*_*ong 6

这是之前接受的答案中代码的更新版本,可以与任何iOS设备一起使用.

由于至少在iPhone 6和iPhone 6+上bufferWidth不等于bytePerRow,我们需要指定每行中的字节数作为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);
Run Code Online (Sandbox Code Playgroud)

该代码已经在运行iOS 10的iPhone5,iPhone6和iPhone6 +上进行了测试.