【问题标题】:open cv ios video processing打开 cv ios 视频处理
【发布时间】:2012-09-03 12:43:39
【问题描述】:

我正在尝试使用 openCv 框架进行 ios 视频处理的教程,找到 here

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

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 文件和相互冲突的自述文件。我想我通过这个link成功地为IOS构建了一个带有avcapture功能的好版本(带有这个标题&lt;opencv2/highgui/cap_ios.h&gt;),然后使用ios目录中的python脚本构建库 - 使用命令python opencv/ios/build_framework.py ios。我会努力更新的

【问题讨论】:

    标签: ios opencv frameworks


    【解决方案1】:

    这是我使用的转换。您锁定像素缓冲区,创建一个 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();
    

    【讨论】:

    • pixelBuffer 是从哪里来的?你有什么代码可以让我使用 avfoundation 和 openCV 与委托 captureOutput:didOutputSampleBuffer:fromConnection:
    • 以下代码至少在我测试过的带有 iOS 10.2 的 iPhone 6 和 iPhone6+ 上不起作用,因为底层像素数组在内存中不连续。请在下面查看我的更新答案。
    【解决方案2】:

    这是之前接受的答案中代码的更新版本,应该适用于任何 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);
    

    代码已在我的运行 iOS 10 的 iPhone5、iPhone6 和 iPhone6+ 上进行了测试。

    【讨论】:

      猜你喜欢
      • 2015-09-08
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 2015-11-08
      • 2013-02-06
      • 1970-01-01
      相关资源
      最近更新 更多