【问题标题】:Losing data when converting from UIImage to Mat从 UIImage 转换为 Mat 时丢失数据
【发布时间】:2014-11-03 01:28:17
【问题描述】:

我正在尝试使用 HSV 阈值在图像中查找红色杯子。我的一个实现使用 cvVideoCamera 委托并直接从相机获取一个垫子。我的另一个实现是让用户录制视频,然后我们使用 AVFoundation 提取帧进行处理。

当我对来自 AVFoundation 的图像进行阈值处理时,除了黑色图像之外,我什么也得不到。

这是我的代码:

inRange(gray, Scalar(114, 135, 135), Scalar(142, 255, 255), dst);

第一个图像是正常工作的图像示例,第二个是来自 AVFoundation 的图像,它没有达到我的预期,它会生成全黑图像。

有谁知道为什么当杯子的颜色看起来很相似时,第二张图片会产生不同的结果?

【问题讨论】:

    标签: ios objective-c opencv uiimage computer-vision


    【解决方案1】:

    从视频中提取的图像会以取决于视频的编码和压缩编解码器的方式进行重建。简短的版本是,除非您碰巧选择了一个关键帧(您通常不会有一个 api 来做,所以尝试这样做是不可行的),您将获得从视频中重建的图像。

    因此,从视频中拍摄的图像与您从相机拍摄直立图像的时间相同(假设您可以同时拍摄这两种图像)会有所不同。在任何排序处理之后,您当然会得到不同的结果。

    在应用阈值之前,获取之前方法的原始图像。查看它们(或它们的增量),您会发现它们不是同一个图像。第二种方法可能会引入伪影,从多帧编码到视频中,然后重建为单帧图像。

    【讨论】:

      【解决方案2】:

      要解决这个问题,请使用 OpenCV Native 转换函数。

       #import <opencv2/imgcodecs/ios.h>
      
      UIImage* MatToUIImage(const cv::Mat& image);
      void UIImageToMat(const UIImage* image,
                               cv::Mat& m, bool alphaExist = false);
      

      【讨论】:

        猜你喜欢
        • 2012-12-29
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 2017-08-09
        • 1970-01-01
        • 2012-06-09
        • 2017-10-16
        • 2019-12-05
        相关资源
        最近更新 更多