1.3 OpenCV定义感兴趣区域ROI
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
int main() {
/********** 定义感兴趣区域 **********/
// 读取 image
cv::Mat image = cv::imread("./images/puppy.bmp", 0);
if (image.empty()) {
cout << "image is empty or no exist.";
return -1;
}
// 读取logo image
cv::Mat logo = cv::imread("./images/smalllogo.png", 0);
if (logo.empty()) {
cout << "image is empty or no exist.";
return -1;
}
// 在图像的右下角定义一个ROI
cv::Mat imageROI(image, cv::Rect(image.cols-logo.cols, image.rows-logo.rows, logo.cols, logo.rows));
// or
// ROI 也可以定义为:
//cv::Mat 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);
// 插入标志
logo.copyTo(imageROI);
// show
cv::imshow("image", image);
/********** 定义感兴趣区域 扩展阅读 - 使用图像掩码 **********/
// 扩展阅读 - 使用图像掩码
// 读取image(以灰色图像)
cv::Mat image2 = cv::imread("./images/puppy.bmp", 0);
// 读取logo image (以灰色图像)
cv::Mat logo2 = cv::imread("./images/smalllogo.png", 0);
//
// 在图像的右下角定义一个ROI
cv::Mat imageROI2= image2(cv::Rect(image2.cols-logo2.cols,image2.rows-logo2.rows, logo2.cols,logo2.rows));
// 把标志作为掩码(必须是灰度图像)
cv::Mat mask(logo2); // 插入标志,只复制掩码不为0的位置
logo2.copyTo(imageROI2, mask);
cv::imshow("image2", image2);
cv::waitKey(0);
return 0;
}
Results: