C# 利用Emgu.CV,多张图片合成全景图

2 篇文章 0 订阅

一、Nuget上引用Emgu.CV的包,使用4.1.X版本

二、vs建立WPF测试工程

       MainWindow上放一个Image控件用来展示合成后的图片。放一个合成按钮

三、准备图片源文件夹,我准备了连续拍摄的18张图片的文件夹。

命名空间:

using System;
using System.IO;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Emgu.CV;
using Emgu.CV.Stitching;
using Emgu.CV.Structure;
using Emgu.CV.Util;
        Stitcher stitcher = new Stitcher(Stitcher.Mode.Panorama);
        Mat[] mat1 = new Mat[18];
        private static ushort width = 640;
        private static ushort height = 480;

        public void HandlePicture()
        {
            image.Source = null;
            DirectoryInfo directory1 = new DirectoryInfo(@"E:\PicRes11");
            FileInfo[] filelist = directory1.GetFiles("*", SearchOption.AllDirectories);

            for (int i = 0; i < 18; i++)
            {
                try
                {
                    Image<Bgr, byte> sou = new Image<Bgr, byte>(filelist[i].FullName).Resize(width, height, Emgu.CV.CvEnum.Inter.Nearest, true);
                    mat1[i] = sou.Mat;
                }
                catch (Exception ex)
                {

                }
            }

            Mat Out_img_1 = new Mat();
            VectorOfMat vectorOfMat1 = new VectorOfMat();
            try
            {
                vectorOfMat1.Push(mat1);
                var status = stitcher.Stitch(vectorOfMat1, Out_img_1);
            }
            catch (Exception ex)
            {
            }
            finally
            {
                vectorOfMat1.Clear();
                vectorOfMat1.Dispose();
                for (int i = 0; i < mat1.Length; i++)
                {
                    if (mat1[i] != null)
                    {
                        mat1[i].Dispose();
                    }
                }
            }
            if (Out_img_1.Bitmap != null)
            {
                IntPtr hBitmap = Out_img_1.Bitmap.GetHbitmap();
                ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                    hBitmap,
                    IntPtr.Zero,
                    Int32Rect.Empty,
                    BitmapSizeOptions.FromEmptyOptions());
                image.Source = wpfBitmap;
                //如果要保存合成的图片:
                //Out_img_1.Save($@"E:\PicRes1\1_{DateTime.Now.ToString("HHmmss")}.jpg");
            }

        }

注意:将合成的Bitmap直接展示在Image控件中,需要Bitmap转ImageSource。

IntPtr hBitmap = Out_img_1.Bitmap.GetHbitmap();
                ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                    hBitmap,
                    IntPtr.Zero,
                    Int32Rect.Empty,
                    BitmapSizeOptions.FromEmptyOptions());
                image.Source = wpfBitmap;

  将合成的图片保存:Out_img_1.Save($@"E:\PicRes1\1_{DateTime.Now.ToString("HHmmss")}.jpg");

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值