在另一个cv::Mat的ROI内复制一个cv::Mat

62
我需要将一个cv::Mat图像(源)复制到另一个(目标)cv::Mat图像的ROI中。我找到了这个参考文献,但似乎不适用于我的情况。您有什么指针可以使用OpenCV C++接口来实现这一点吗?
3个回答

94

OpenCV 2.4:

src.copyTo(dst(Rect(left, top, src.cols, src.rows)));

OpenCV 2.x:

Mat dst_roi = dst(Rect(left, top, src.cols, src.rows));
src.copyTo(dst_roi);

2
产生了“没有找到与‘cv::Mat::copyTo(cv::Mat)’匹配的函数”的错误 viewtest2.cpp:172:61: 注意:候选项为: /usr/include/opencv2/core/core.hpp:1651:10: 注意:void cv::Mat::copyTo(cv::OutputArray) const”在OpenCV 2.4.6中。第二种解决方案确实可行,但它会导致只有src的图像。 - pbond
6
先前版本的OpenCV和现在的有何不同?代码为什么不同?之前版本的OpenCV与现在的版本相比,可能包含不同的功能、修复了不同的错误和漏洞、改进了性能和稳定性等方面的变化。这些变化可能导致代码的差异,因为开发人员需要适应新的API和更改的函数行为等内容。 - nkint
src.copyTo(dst(Rect(left, top, src.cols, src.rows)); 3个左括号和2个右括号?Mat dst_roi = dst(Rect(left, top, src.cols, src.rows); 2个左括号和1个右括号?未经测试的代码? - TimZaman
这个 dst_roi 是指向目标图像的某个特定部分的指针吗?我猜应该是这样的。 - Samitha Chathuranga
1
Valgrind报告说我在使用OpenCV 3.2时存在内存泄漏问题,但是程序仍然可以正常运行。 - lawilog
显示剩余2条评论

13

除了上面的回答之外,如果您想将一个较小的开放Mat区域复制到另一个Mat中,应该执行以下操作:

src(Rect(left,top,width, height)).copyTo(dst);

11

这种方法对我有用:

Mat imgPanel(100, 250, CV_8UC1, Scalar(0));
Mat imgPanelRoi(imgPanel, Rect(0, 0, imgSrc.cols, imgSrc.rows));
imgSrc.copyTo(imgPanelRoi);

imshow("imgPanel", imgPanel);
waitKey();

我正在使用Opencv 2.4.9,基于Andrey的回答。


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