定义方式
此两种方法设置的imageROI均指向原图中的对应区域
1.Rect
Mat imageROI;
imageROI = image(Rect(500, 250, ROI_COLS, ROI_ROWS));
2.Range()
imageROI = image(Range(250, 250+ROI_ROWS), Range(250, 250+ROI_COLS));
应用
1.掩膜操作
这里用的掩膜和cover基本上是一个,但是意思差不多,感兴趣可以换一张
Mat srcImg = imread("src.jpg");
Mat coverImg = imread("cover.jpg");
Mat imgROI = srtImg(Rect(500, 250, logoImg.cols, logoImg,rows));
Mat mask = imread("cover.jpg",0); //掩膜必须为灰度图
coverImg.copyTo(imgROI, mask);
namedWindow("TEST");
imshow("TEST",srcImg);
效果如下:
srcImg
coverImg
最后的效果
mask:即掩模。掩模是由0和1组成的一个二进制图像。当在某一功能中应用掩模时,1值区域被处理,被屏蔽的0值区域不被包括在计算中。通过指定的数据值、数据范围、有限或无限值、感兴趣区和注释文件来定义图像掩模,也可以应用上述选项的任意组合作为输入来建立掩模。(来自百度百科http://baike.baidu.com/view/2062299.htm)
线性混合操作
公式:
g
(
x
)
=
(
1
−
a
l
p
h
a
)
∗
f
1
(
x
)
+
a
l
p
h
a
∗
f
2
(
x
)
g(x)=(1-alpha)*f_{1}(x)+alpha*f_{2}(x)
g(x)=(1−alpha)∗f1(x)+alpha∗f2(x)
既可对图像进行也可对视频进行
addWeighted()
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
d s t = s r c 1 [ I ] ∗ a l p h a + s r c 2 [ I ] ∗ b e t a + g a m m a dst=src1[I]*alpha+src2[I]*beta+gamma dst=src1[I]∗alpha+src2[I]∗beta+gamma
需要注意的是 src2需要和src1具有相同的尺寸和通道数
dst和输入数组具有相同的尺寸和通道数
可以结合ROI来用
#include "opencv2/opencv.hpp"
using namespace cv;
int main()
{
Mat srcimg1 = imread("aete.jpg");
Mat srcimg2 = imread("test.png");
Mat imgROI = srcimg1(Rect(100,100,srcimg2.cols,srcimg2.rows));
Mat desimg;
addWeighted(imgROI, 0.8, srcimg2, 0.2, 0.0, desimg);
desimg.copyTo(imgROI);
namedWindow("TEST"),
imshow("TEST",srcimg1);
imwrite("jieguo.jpg",srcimg1);
waitKey(0);
return 0;
}
效果如下:
srcimg1
srcimg2
混合结果