Mat对象的简单算术运算
1 Mat src1 = imread("F:/opencv4.1.0/sources/samples/data/WindowsLogo.jpg"); 2 Mat src2 = imread("F:/opencv4.1.0/sources/samples/data/LinuxLogo.jpg"); 3 if (src1.empty() || src2.empty()) { 4 printf("could not find image"); 5 return -1; 6 } 7 8 imshow("input1", src1); 9 imshow("input2", src2); 10 Mat dst1; 11 add(src1, src2,dst1); 12 imshow("add-demo", dst1); 13 14 Mat dst2; 15 subtract(src1, src2, dst2); 16 imshow("subtract-demo", dst2); 17 18 Mat dst3; 19 multiply(src1, src2, dst3); 20 imshow("multiply-demo", dst3); 21 22 Mat dst4; 23 divide(src1, src2, dst4); 24 imshow("divide-demo", dst4);
Mat对象的加权函数addWidget
线性混合就是指两个图片或两段视频以某种函数关系叠加呈现。
addWeighted原函数:
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);
第一个参数:要叠加的第一个图像Mat
第二个参数:标识第一个参数叠加的权重
第三个参数:表示第二个叠加的图像,他需要和第一个数组拥有同样的尺寸和通道数
第四个参数:表示第二个叠加图像的权重
第五个参数:输出参数,需要和前两个图像拥有同样的通道数和尺寸
第六个参数:一个加到权重总和上的标量值(填0就好)
第七个参数:输出阵列的深度有默认值-1, 当两张叠加图片深度相同时,参数为-1
如函数:
1 void mixImages() { 2 Mat image = imread("images/alpha.png"); 3 Mat logo0 = imread("images/logo.png"); 4 Mat logo; 5 // 缩小logo 6 resize(logo0, logo, Size(0.5 * logo0.cols, 0.5 * logo0.rows)); 7 8 Mat imageROI; 9 //在image mat中取出要打上logo的位置进行融合 10 //方法1 11 //imageROI = image(Rect(10, 20, logo.cols, logo.rows)); 12 //方法2 13 imageROI = image(Range(10, 10 + logo.rows), Range(20, 20 + logo.cols)); 14 addWeighted(imageROI, 0.5, logo, 0.3, 0., imageROI); 15 16 imshow("融合", image); 17 //compression_params 为存些图片的参数 18 vector<int> compression_params; 19 compression_params.push_back(IMWRITE_PNG_COMPRESSION); 20 compression_params.push_back(9); //png格式下,默认的参数为3. 21 try { 22 // cv 创建的窗口无法显示透明,所以会发现显示的是jpg的图片,保存后用 window图片查看器看图就会有透明显示 23 imwrite("addlog.jpg", image, compression_params); 24 imwrite("addlog.png", image, compression_params); 25 } 26 catch (runtime_error& ex) { 27 fprintf(stderr, "save image erro %s\n", ex.what()); 28 return; 29 30 } 31 }