图像打开、混合显示和输出
视频讲解如下:
当前系列所有demo下载地址:
https://github.com/GaoRenBao/OpenCv4-Demo
不同编程语言对应的OpenCv版本以及开发环境信息如下:
语言 | OpenCv版本 | IDE |
C# | OpenCvSharp4.4.8.0.20230708 | Visual Studio 2022 |
C++ | OpenCv-4.5.5-vc14_vc15 | Visual Studio 2022 |
Python | OpenCv-Python (4.6.0.66) | PyCharm Community Edition 2022.1.3 |
图像混合使用的主要函数为:AddWeighted
函数原型如下:
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)
参数说明如下:
第一个参数:InputArray 类型的srcl, 表示需要加权的第一个数组,常常填一个Mat;
第二个参数:double类型的alpha, 表示第一个数组的权重;
第三个参数:InputArray 类型的src2, 表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数;
第四个参数:double 类型的beta, 表示第二个数组的权重值;
第五个参数:double类型的gamma, 一个加到权重总和上的标量值。其含义通过接下来列出的式子自然会理解;
第六个参数:OutputArray 类型的dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数:
第七个参数:int类型的dtype, 输出阵列的可选深度,有默认值-1。当两个输入数组具有相同的深度时,这个参数设置为-1 (默认值),即等同于srcl .depth()。
首先需要准备一张图片原图 a.jpg

然后再准备一张用于叠加的log图片 b.jpg

叠加效果如下:

下面给大家演示了C#、C++、Python这三种环境下是如何进行图像打开、混合显示和输出。
C#版本代码如下:
C#版本需要安装“OpenCvSharp4”、“OpenCvSharp4.runtime.win”两个库才行。不然会报错。
如果需要使用“ BitmapConverter.ToBitmap”操作,则需要追加安装“OpenCvSharp4.Extensions”库。
using OpenCvSharp;
namespace demo
{
internal class Program
{
static void Main(string[] args)
{
// 读取图片
Mat image1 = Cv2.ImRead("../../../images/a.jpg");
Mat image2 = new Mat("../../../images/b.jpg");
// 设置图片2需要显示的区域
Mat imageROI = image1[new Rect() { X = 800, Y = 350, Height = image2.Rows, Width = image2.Cols }];
// 重叠两张图片
Cv2.AddWeighted(imageROI, 0.7, image2, 0.3, 0.0, imageROI);
Cv2.ImShow("合并", image1);
Cv2.WaitKey(0);
// 显示图片到pictureBox
//Bitmap map = BitmapConverter.ToBitmap(image1);
//pictureBox1.Image = map;
//// 弹窗显示
//using (new Window("合并", image1))
//{
// Cv2.WaitKey();
//}
}
}
}
C++版本代码如下:
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
// 描述:初级图像混合
int main()
{
//载入图片
Mat image1 = imread("../images/a.jpg");
Mat image2 = imread("../images/dota_logo.jpg");
//载入后先显示
namedWindow("image1");
imshow("image1", image1);
namedWindow("image2");
imshow("image2", image2);
//定义一个Mat类型,用于存放,图像的ROI
Mat imageROI;
//方法一
imageROI = image1(Rect(800, 350, image2.cols, image2.rows));
//方法二
//imageROI=image1(Range(350,350+image2.rows), Range(800,800+image2.cols));
//将image2加到image1上
addWeighted(imageROI, 0.5, image2, 0.3, 0, imageROI);
//显示结果
namedWindow("合并");
imshow("合并", image1);
//输出一张jpg图片到工程目录下
imwrite("out.jpg", image1);
waitKey(0);
return 0;
}
Python版本代码如下:
import cv2
import numpy as np
# 载入图片
image1 = cv2.imread('../images/a.jpg')
image2 = cv2.imread('../images/dota_logo.jpg')
# 载入后先显示
cv2.imshow('image1', image1)
cv2.imshow('image2', image2)
# 设置显示区域和位置
rows, cols, channels = image2.shape
roi = image1[350:350 + rows, 800:800 + cols]
imageROI = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
imageROI = cv2.bitwise_and(roi, roi, mask=imageROI)
# 组合图像
dst = cv2.addWeighted(imageROI, 0.7, image2, 0.3, 0, imageROI)
image1[350:350 + rows, 800:800 + cols] = dst
# 显示组合结果
cv2.imshow('合并', image1)
cv2.waitKey(0)
cv2.destroyAllWindows()