7.OpenCvSharp图像的文件夹的批量读取、表单显示及多图拼接——c#OpenCvSharp学习笔记

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 + "毫秒");
            }
        }

源代码: https://download.csdn.net/download/sunsoldeir1/87123487

猜你喜欢

转载自blog.csdn.net/sunsoldeir1/article/details/127994796
今日推荐