打开cv ios视频​​处理

时间:2012-09-10 15:56:21

标签: ios opencv frameworks

我正在尝试使用openCv框架为ios视频​​处理找到here教程。

我已成功将ios openCv框架加载到我的项目中 - 我的框架与教程中提供的框架似乎不匹配,我希望有人可以帮助我。< / p>

OpenCv使用cv::Mat类型来表示图像。使用AVfoundation委派来处理来自摄像头的图像时 - 我需要将所有CMSampleBufferRef转换为该类型。

本教程中提供的openCV框架似乎提供了一个名为using

的库
#import <opencv2/highgui/cap_ios.h>

使用新的委托命令:

任何人都可以指出我在哪里可以找到此框架,或者可能在CMSampleBufferRefcv::Mat之间快速转换

修改

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

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:6)

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

由于bufferWidth至少在iPhone 6和iPhone 6+上不等于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);

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