我正在尝试使用openCv框架为ios视频处理找到here教程。
我已成功将ios openCv框架加载到我的项目中 - 但我的框架与教程中提供的框架似乎不匹配,我希望有人可以帮助我。< / p>
OpenCv使用cv::Mat
类型来表示图像。使用AVfoundation委派来处理来自摄像头的图像时 - 我需要将所有CMSampleBufferRef
转换为该类型。
本教程中提供的openCV框架似乎提供了一个名为using
的库#import <opencv2/highgui/cap_ios.h>
使用新的委托命令:
任何人都可以指出我在哪里可以找到此框架,或者可能在CMSampleBufferRef
和cv::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
。我会尝试更新
答案 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 +上进行了测试。