Copy an cv::Mat inside a ROI of another one
Asked Answered
P

3

62

I need to copy a cv::Mat image (source) to an ROI of another (Destination) cv::Mat image.

I found this reference, but it seems that it does not work for my case. Do you have any pointers how could I do this using the OpenCV C++ interface?

Preliminaries answered 7/5, 2012 at 11:38 Comment(0)
D
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);
Dumyat answered 7/5, 2012 at 12:40 Comment(7)
thanks! I did it like this and works great: bboxImage.copyTo(destImage.colRange(startCol,startCol+bboxImage.cols).rowRange(startRow,startRow+bboxImage.rows));Preliminaries
Yields no matching function for call to ‘cv::Mat::copyTo(cv::Mat)’ viewtest2.cpp:172:61: note: candidates are: /usr/include/opencv2/core/core.hpp:1651:10: note: void cv::Mat::copyTo(cv::OutputArray) const in OpenCV 2.4.6. Second solution does work however, but it results into an image with just src.Krieger
what is the difference between previous version of opencv? why the code differs?Mukluk
src.copyTo(dst(Rect(left, top, src.cols, src.rows)); 3x '(' and 2x ')'? Mat dst_roi = dst(Rect(left, top, src.cols, src.rows); 2x '(' and 1x ')'? Untested code?Breaux
Is this dst_roi, a pointer to the certain part of the destination image? I guess it should be so..Paniagua
valgrind reports memory leaks when I do this with OpenCV 3.2. But it works ^^Fantail
@Fantail Did you ever figure out how to do this without leaking memory? I'm running into the same issue, and am surprised that there is such a big bug in commonly used OpenCV stuff...Ziska
T
13

In addition or correction to above answers, if you want to copy a smaller region of open Mat to another Mat, you should do:

src(Rect(left,top,width, height)).copyTo(dst);
Tetrapody answered 8/7, 2015 at 2:11 Comment(0)
D
11

Did work for me this way:

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

I am using Opencv 2.4.9 Based on Andrey's answer.

Dorseydorsiferous answered 5/10, 2014 at 12:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.