1、核心逻辑:
- 使用Mat类加载两张图片
- 使用AddWeighted方法进行图像混合(线性叠加)
2、参数说明:
-
第2个参数:第一张图的权重(alpha)
-
第4个参数:第二张图的权重(beta)
-
第5个参数:gamma值(亮度调节)
3、关键处理:
-
检查图片尺寸一致性
-
资源释放管理(使用using语句)
-
Mat到Bitmap的转换
-
混合参数可根据需求调整(alpha + beta 不需要等于1)
4、程序
using System;
using System.Drawing;
using System.Windows.Forms;
using OpenCvSharp;
namespace ImageOverlayWinForm
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
this.Text = "Image Overlay Demo";
this.Size = new Size(800, 600);
// 创建控件
var btnProcess = new Button { Text = "Process", Location = new Point(10, 10) };
var pictureBox1 = new PictureBox { Location = new Point(10, 50), Size = new Size(300, 300) };
var pictureBox2 = new PictureBox { Location = new Point(320, 50), Size = new Size(300, 300) };
var pictureBoxResult = new PictureBox { Location = new Point(10, 360), Size = new Size(600, 200) };
btnProcess.Click += (sender, e) =>
{
try
{
// 加载图片(修改为你的图片路径)
using (var mat1 = new Mat(@"D:\image1.jpg"))
using (var mat2 = new Mat(@"D:\image2.jpg"))
{
// 检查图片是否加载成功
if (mat1.Empty() || mat2.Empty())
{
MessageBox.Show("Failed to load images!");
return;
}
// 检查图片尺寸是否相同
if (mat1.Size() != mat2.Size())
{
MessageBox.Show("Images must have the same dimensions!");
return;
}
// 创建结果矩阵
using (var result = new Mat())
{
// 图像叠加(alpha=0.5 各占50%透明度)
Cv2.AddWeighted(mat1, 0.5, mat2, 0.5, 0, result);
// 显示结果
pictureBoxResult.Image?.Dispose();
pictureBoxResult.Image = MatToBitmap(result);
}
// 显示原始图片(可选)
pictureBox1.Image?.Dispose();
pictureBox1.Image = MatToBitmap(mat1);
pictureBox2.Image?.Dispose();
pictureBox2.Image = MatToBitmap(mat2);
}
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}
};
Controls.Add(btnProcess);
Controls.Add(pictureBox1);
Controls.Add(pictureBox2);
Controls.Add(pictureBoxResult);
}
// 将Mat转换为Bitmap
private Bitmap MatToBitmap(Mat mat)
{
return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);
}
}
}







网友评论