【准备工作】准备一个小图像和大图像。接下来要将小图像复制到大图像上。即定义一个感兴趣区域,在此处进行复制操作。
【实现】
定义ROI,把ROI当作一个普通的 cv::Mat 实例进行操作。
cv::Mat image;
image = cv::imread("1.jpg");
cv::Mat logo;
logo = cv::imread("ROI.jpg");
//在图像右下角定义一个ROI
cv::Mat imageROI(image,
cv::Rect(image.cols - logo.cols, //ROI坐标
image.rows - logo.rows,
logo.cols, logo.rows));//ROI大小
//插入标志
logo.copyTo(imageROI);
cv::namedWindow("ImageROI");
cv::imshow("ImageROI", image);
cv::waitKey(0);
【实现原理】
使用 cv::Rect 确定左上角位置和矩形尺寸,描述一个矩形区域。
还可以使用 cv::Range 来描述,即用行和列的值域描述,因此也可以使用以下代码定义ROI。
imageROI= image(cv::Range(image.rows-logo.rows,image.rows),
cv::Range(image.cols-logo.cols,image.cols));
//要定义由图像中的一些行组成的 ROI,可用下面的代码:
cv::Mat imageROI= image.rowRange(start,end);
//与之类似,要定义由图像中一些列组成的 ROI,可用下面的代码:
cv::Mat imageROI= image.colRange(start,end);
【扩展阅读】
可以利用图片掩码只复制标志中的白色部分。
cv::Mat image;
image = cv::imread("1.jpg");
cv::Mat logo;
logo = cv::imread("ROI.jpg");
//在图像右下角定义一个ROI
cv::Mat imageROI(image,
cv::Rect(image.cols - logo.cols, //ROI坐标
image.rows - logo.rows,
logo.cols, logo.rows));//ROI大小
//-------把标志作为掩码(必须是灰度图像)------
cv::Mat mask(logo);
//-------插入标志,只复制掩码不为0的位置-------
logo.copyTo(imageROI,mask);
cv::namedWindow("ImageROI");
cv::imshow("ImageROI", image);
cv::waitKey(0);