0.项目概述
项目实现了基于OpenCvSharp进行基本的的图像多图批量拼接,可批量读取在同一个文件内多个图像,可显示每张图片的信息,还可以进行单图逐个预览,并进行多图批量拼接,最后将图片保存到本地磁盘。
其余内容参考上篇博客:https://blog.csdn.net/sunsoldeir1/article/details/127190286
源代码在本文底部
1基础步骤和界面设计
1.1引用using OpenCvSharp;using OpenCvSharp.Extensions;
1.2将Picturebox、dataGridview、Label、Button、ComBobox等控件进行布局、改名、调整形状和字体,形成如下界面:
2功能实现
2.1初始化变量
private int ImgCount; //图片总数
private List<string> ImgPaths = new List<string>(); //图片路径列表
private int ImgIDndex = 0; //预览图片和表格中当前图片序号
Mat Img1 = new Mat();//用 Mat类定义图片1
Mat Img2 = new Mat();//用 Mat类定义图片2
Mat Img3 = new Mat();//用 Mat类定义图片3
String Save_path;
Bitmap bitmap;//Bitmap类定义picturebox3要显示的图片
2.2初始化表格变量
用于设置dataGridView的参数
private void DataGridView_setting() //初始化表格
{
this.dataGridView1.Columns.Add("data_C0", "编号");
this.dataGridView1.Columns.Add("data_C1", "分辨率");
this.dataGridView1.Columns.Add("data_C2", "容量");
this.dataGridView1.Font = new Font("隶书", 12, FontStyle.Bold);
this.dataGridView1.RowsDefaultCellStyle.Font = new Font("宋体", 10, FontStyle.Bold);
this.dataGridView1.RowsDefaultCellStyle.ForeColor = Color.Blue;
// 选中行
this.dataGridView1.Columns[0].FillWeight = 10;
this.dataGridView1.Columns[1].FillWeight = 20;
this.dataGridView1.Columns[2].FillWeight = 15;
}
2.3设置选择文件文件按钮
private void button2_Click(object sender, EventArgs e)
{
FolderBrowserDialog folderBrowserDialog1 = new FolderBrowserDialog();
folderBrowserDialog1.Description = "当前路径为:" + Save_path;
if (Save_path != "")
{
//设置此次默认目录为上一次选中目录
folderBrowserDialog1.SelectedPath = Save_path;
}
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK || folderBrowserDialog1.ShowDialog() == DialogResult.Yes)
{
Save_path = folderBrowserDialog1.SelectedPath;
Properties.Settings.Default.Save_path = Save_path;
Properties.Settings.Default.Save();//保存上面的值,以便下次调用
foreach (string Path in Directory.GetFiles(folderBrowserDialog1.SelectedPath)) //从“文件夹”中读取
{
string PathExt = Path.Substring(Path.Length - 3, 3);
if (PathExt == "jpg" || PathExt == "bmp" || PathExt == "png" || PathExt == "gif") //筛选图片格式
{
ImgPaths.Add(Path);
}
}
if (ImgPaths.Count != 0)
{
ImgCount = ImgPaths.Count; //获取图片总数
}
}
label3.Text = "图片总数:" + ImgCount.ToString();
label2.Text = "图片序号:" + (ImgIDndex+1).ToString();
this.pictureBox1.Image = Bitmap.FromFile(ImgPaths[ImgIDndex]); //加载第一幅图片
for (int i = 0; i < ImgCount; i++)
{
int index = this.dataGridView1.Rows.Add();
this.dataGridView1.Rows[index].Cells[0].Value = (i+1).ToString();//编号
//
Mat img5 = Cv2.ImRead(ImgPaths[i]);
this.dataGridView1.Rows[index].Cells[1].Value = img5.Rows.ToString()+"*"+ img5.Cols.ToString();//分辨率
long length = new System.IO.FileInfo(ImgPaths[i]).Length;
this.dataGridView1.Rows[index].Cells[2].Value = (length/1000).ToString()+" KB";
}
}
2.4 图像拼接并提示处理时间
private void button6_Click_1(object sender, EventArgs e)
{
int time1 = DateTime.Now.Minute* 60* 1000 + DateTime.Now.Second*1000+ DateTime.Now.Millisecond;计下开始时刻
if (ImgCount < 2)//判断图片或下拉栏目是否为空
{
MessageBox.Show("图片数量少于2张");
return;
}
else
{
Mat[] images = new Mat[ImgCount];
Stitcher stitcher = Stitcher.Create(Stitcher.Mode.Scans);
Mat pano = new Mat();
for (int newID = 0; newID < ImgCount; newID++)
{
images[newID]=Cv2.ImRead(ImgPaths[newID]);
}
var status = stitcher.Stitch(images, pano);
if (status != Stitcher.Status.OK)
{
MessageBox.Show("失败:" + status.ToString());
return;
}
else
{
bitmap = BitmapConverter.ToBitmap(pano); //把Mat格式的图片转换成Bitmap
pictureBox3.Image = bitmap;
}
int time2 = DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;计下开始时刻
int time3 = (time2- time1);//计算耗时
MessageBox.Show(ImgCount+"张图片,"+"共耗时:" + time3 + "毫秒");
}
}