第一件事:ROI 区域图像叠加&图像混合
1. ROI:感兴趣区域
定义一个 ROI 有两种方法:
- 第一种使用 Rect 来表示感兴趣的区域:
它指定矩形的左上角坐标和矩形的长度,来定义一个矩形区域。
示例代码:
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
cv::Mat image = cv::imread("1.jpg");
cv::Mat logo = cv::imread("logo.jpg");
cv::Mat imageROI;
cv::Mat imageROI = image(cv::Rect(500,250,logo.cols,logo.rows));
cv::imshow("roi",imageROI);
cv::waitKey();
return 0;
}
- 第二种方法,是指定感兴趣的行或列的范围。Range 表示从起始位子到终止位置的索引。
示例代码:
cv::Mat image = cv::imread("1.jpg");
cv::Mat logo = cv::imread("logo.jpg");
cv::Mat imageROI;
cv::Mat imageROI = image(cv::Range(250,250 + logo.rows), cv::Range(200, 200 + logo.cols));
2. 线性混合操作
典型二元像素操作,理论公式如下:
我们通过改变 α 的值来实现两张图片的叠化效果。OpenCV 为我们封装好了一个 addWeight 函数来实现这个功能。我们继续往下看。
3. 计算数组加权和:addWeight 函数
这个函数的作用是计算两个矩阵的加权和。函数原型:
void addWeighted(InputArray src1, double alpha, InputArray src2,
double beta, double gamma, OutputArray dst, int dtype = -1);
参数 | 解释 |
---|---|
InputArray src1 | 表示要加权的第一个矩阵 |
double alpha | 表示第一个数组的权重值 |
InputArray src2 | 表示要加权的第二个矩阵,需要和第一个数组具有相同的通道数和尺寸 |
double beta | 表示第二个数组的权重值 |
double gamma | 加到权重总和上的一个常量 |
OutputArray dst | 输出矩阵 |
int dtype | 输出矩阵的可选深度,默认-1,代表 src1 的图像深度 |
示例代码:
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
cv::Mat srcImage = cv::imread("1.jpg");
cv::Mat logoImage = cv::imread("Code_r_Wang.jpg");
cv::Mat imageROI;
cv::Mat dstImage;
cv::imshow("srcwindow", srcImage);
cv::addWeighted(srcImage(cv::Rect(0,0,logoImage.cols,logoImage.rows)), 0.5, logoImage, 0.5, 0.0, srcImage(cv::Rect(0,0,logoImage.cols,logoImage.rows)));
cv::imshow("window", srcImage);
cv::waitKey();
return 0;
}