首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开放cv视频处理

开放cv视频处理
EN

Stack Overflow用户
提问于 2012-09-10 15:56:20
回答 2查看 5.9K关注 0票数 5

我试图做的教程找到了这里的ios视频处理与openCv框架。

我已经成功地将ios openCv框架加载到了我的项目中,但是似乎与教程中的框架不匹配,我希望有人能帮助我。

OpenCv使用cv::Mat类型来表示图像。当使用AVfoundation委托处理来自相机的图像时,我需要将所有的CMSampleBufferRef转换成这种类型。

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

代码语言:javascript
复制
#import <opencv2/highgui/cap_ios.h>

使用新的委托命令:

有人能指出我在哪里可以找到这个框架,或者在CMSampleBufferRefcv::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。我会试着更新

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-10 16:21:23

下面是我使用的转换。锁定像素缓冲区,创建cv::Mat,使用cv::Mat处理,然后解锁像素缓冲区。

代码语言:javascript
复制
- (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将为您释放内存。如果您想要自己的缓冲区副本,只需执行

代码语言:javascript
复制
cv::Mat copied_image = image.clone();
票数 14
EN

Stack Overflow用户

发布于 2017-04-20 15:11:42

这是前一个接受的答案中代码的更新版本,它应该与任何iOS设备一起工作。

由于bufferWidth不等于bytePerRow (至少在iPhone 6和iPhone 6+上),所以我们需要指定每一行中的字节数作为cv::Mat构造函数的最后一个参数。

代码语言:javascript
复制
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+上进行了测试。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12355257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档