在OpenCV 2.4.3(iOS)中裁剪Mat图像

6
我正在尝试使用OpenCV for iOS裁剪视频流中的图像。我只想简单地裁剪图像并显示它,没有任何花哨的东西。我尝试过这个这个,但似乎都不适用于我。作为委托方法,我得到了当前的cv :: Mat图像,所以我只需要创建裁剪效果的代码即可。
如果需要,我可以做像这样复杂的事情,但我只需要一个矩形裁剪,所以我认为有更简单的方法。我只是不明白为什么设置ROI对我不起作用!
cv::Rect myROI(10, 10, 100, 100);
cv::Mat croppedImage = src(myROI);

src.copyTo(croppedImage);


[displayView setImage:[UIImage imageWithCVMat:src]];

^^^无法工作,仅显示原始图像


嗨,我遇到了同样的问题。你能否请看一下我的帖子https://dev59.com/7G7Xa4cB1Zd3GeqPnDJV? - 2vision2
1个回答

24

你的代码问题在于通过复制源图像,你将整个图像复制到了剪裁后的图像中。

有两种可能:

1- 不复制数据。这与您所做的相同。但没有第二步。在这种情况下,croppedImage不是真正的副本,而是指向在src中分配的数据的指针。

cv::Mat croppedImage = src(myRoi);

2- 复制数据。

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

(一行代码方法 - cv::Mat croppedImage = cv::Mat(src, myRoi).clone();)


1
我之前尝试了你提出的第一个建议,但是当我显示它时,它看起来非常混乱 (有点像电视静态)。你提到的第二种方法对我很有效,谢谢! - Jameo
2
@Jameo,你的显示方法可能假设数据是连续的,但使用第一种方法并不成立。 - Hammer
第二个建议对我有效,而第一个失败了。 - jarora
@jarora - 你遇到了什么样的错误?请在第一种情况中提到,croppedImage和myRoi的图像数据指针指向一个数据对象。 - Tobias Senst
还有一种使用 clone 方法的单行代码(而不是 copyTo)- cv::Mat croppedImage = cv::Mat(src, myRoi).clone(); - user924
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接