1

我想尝试一个简单的 OpenCV 示例,如下所示:

Mat greyMat;
cvtColor(image, greyMat, CV_BGR2GRAY);
filtered_image = [self UIImageFromCVMat:greyMat];
[color_filtered_view setImage:filtered_image];

其中图像只是另一个 Mat(从相机获得),如果按下按钮则执行。

不幸的是,绝对没有任何事情发生。图像视图保持空白。

setNeedsLayout 和 setNeedsDisplay 无济于事,但如果我旋转我的设备(并强制布局适应另一个方向),图像会突然可见。

怎么了?

更新:

发现这个问题只是因为 CvVideoCamera 正在流式传输到另一个视图,因此不是因为 Mat 到 UIImage 转换。问题是这个(正在运行的 CvVideoCamera)为什么/如何阻止 setImage?

4

2 回答 2

1

今天我遇到了同样的问题,我相信这与从另一个线程调用 setImage 调用这一事实有关。这段代码对我有用:

dispatch_sync(dispatch_get_main_queue(), ^{
   [color_filtered_view setImage:filtered_image];
});

祝你好运!

于 2013-07-11T21:33:35.673 回答
0

您的代码中的问题是,通过复制 src 图像,您可以将整个图像复制到裁剪后的图像中。有两种可能:

1 - 不复制数据。它和你做的一样。但是没有第二步。在这种情况下,croppedImage 不是真正的副本,它指向 src 中分配的数据:

 cv::Mat croppedImage = src(myRoi);

2 - 复制数据。

 cv::Mat croppedImage;
 cv::Mat(src, myRoi).copyTo(croppedImage)

使用这个openCV链接可以更好地理解。
我希望它对你有用。

于 2013-05-23T14:05:06.707 回答