我试图做的教程找到了这里的ios视频处理与openCv框架。
我已经成功地将ios openCv框架加载到了我的项目中,但是似乎与教程中的框架不匹配,我希望有人能帮助我。
OpenCv使用cv::Mat类型来表示图像。当使用AVfoundation委托处理来自相机的图像时,我需要将所有的CMSampleBufferRef转换成这种类型。
似乎本教程中提供的openCV框架提供了一个名为
#import <opencv2/highgui/cap_ios.h>使用新的委托命令:
有人能指出我在哪里可以找到这个框架,或者在CMSampleBufferRef和cv::Mat之间快速转换吗?
编辑
opencv框架中有很多细分(至少对于ios来说是这样)。我已经通过各种“官方”网站下载了它,还使用了诸如fink和brew等工具使用它们的说明。我甚至比较了安装到/usr/local/include/opencv/的头文件。每次都不一样。下载openCV项目时,同一个项目中有不同的cmake文件和冲突的自述文件。我认为我成功地为IOS构建了一个很好的版本,它通过这个<opencv2/highgui/cap_ios.h>内置到框架中(使用这个标头链接 ),然后使用ios目录中的python脚本构建库--使用命令python opencv/ios/build_framework.py ios。我会试着更新
发布于 2012-09-10 16:21:23
下面是我使用的转换。锁定像素缓冲区,创建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();发布于 2017-04-20 15:11:42
这是前一个接受的答案中代码的更新版本,它应该与任何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 10的iPhone6和iPhone6+上进行了测试。
https://stackoverflow.com/questions/12355257
复制相似问题