【问题标题】:Crop Mat image in OpenCV 2.4.3 (iOS)OpenCV 2.4.3 (iOS) 中的裁剪垫图像
【发布时间】:2018-03-15 22:49:20
【问题描述】:

我正在尝试使用适用于 iOS 的 OpenCV 裁剪来自视频流的图像。我不想做任何花哨的事情,只是裁剪图像并显示它。我试过thisthis,似乎都不适合我。作为一个委托方法,我得到了当前的 cv::Mat 图像,所以我需要的只是创建裁剪效果的代码。

如果需要,我可以做一些像this 这样复杂的事情,但我只需要一个矩形裁剪,所以我认为有一个更简单的方法。我只是不明白为什么设置 ROI 对我不起作用!

cv::Rect myROI(10, 10, 100, 100);
cv::Mat croppedImage = src(myROI);

src.copyTo(croppedImage);


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

^^^不工作,只显示原图

【问题讨论】:

标签: ios opencv


【解决方案1】:

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

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();

【讨论】:

  • 我之前尝试过你的第一个建议,当我展示它时,它看起来非常糟糕(有点像电视静态)。你提到的第二种方法对我有用,谢谢!
  • @Jameo 您的显示方法可能假设数据是连续的,而使用第一种方法则不正确。
  • 第二个建议对我有用,而第一个建议失败了。
  • @jarora - 你得到什么样的错误?请注意,在第一种情况下 croppedImage 和 myRoi 图像数据 ptr 指向一个数据对象
  • 谢谢!你刚刚救了我。在Java(Android)中,我可以使用`public Mat(Mat m, Rect roi);——例如——Mat cropped = new Mat(src, myRoi);——效果很好。在 iOS 中我尝试了第一种方法但没有用,现在我使用第二种方法,效果很好
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 2017-08-04
  • 2023-03-05
  • 2014-01-31
  • 1970-01-01
相关资源
最近更新 更多