从UIImage转换为Mat时丢失数据

时间:2014-11-03 01:28:17

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

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

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

这是我的代码:

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

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

enter image description here

enter image description here

当杯子的颜色看起来非常相似时,有没有人知道为什么第二张图像产生不同的结果呢?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

 #import <opencv2/imgcodecs/ios.h>

UIImage* MatToUIImage(const cv::Mat& image);
void UIImageToMat(const UIImage* image,
                         cv::Mat& m, bool alphaExist = false);