当前位置: 首页 > news >正文

代码片段 - C#实现多张图片根据重叠部分拼接图像

安装Nuget包

  • Emgu.CV
  • Emgu.CV.runtime.windows
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Features2D;
using Emgu.CV.Stitching;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System.Diagnostics;
namespace Tools
{
    public class ImageStitcher
    {
        public static void StitchImages(string[] imagePaths, string stitchedImagePath)
        {
            Image<Bgr, byte>[] sourceImages = new Image<Bgr, byte>[imagePaths.Length];
            for (int i = 0; i < sourceImages.Length; i++)
            {
                sourceImages[i] = new Image<Bgr, byte>(imagePaths[i]);
            }
            try
            {
                //only use GPU if you have build the native binary from code and enabled "NON_FREE"
                using (Stitcher stitcher = new Stitcher())
                using (Emgu.CV.Features2D.AKAZE finder = new Emgu.CV.Features2D.AKAZE())
                using (Emgu.CV.Stitching.WarperCreator warper = new SphericalWarper())
                {
                    stitcher.SetFeaturesFinder(finder);
                    stitcher.SetWarper(warper);
                    using (VectorOfMat vm = new VectorOfMat())
                    {
                        Mat result = new Mat();
                        vm.Push(sourceImages);

                        Stopwatch watch = Stopwatch.StartNew();

                        Stitcher.Status stitchStatus = stitcher.Stitch(vm, result);
                        watch.Stop();

                        if (stitchStatus == Stitcher.Status.Ok)
                        {
                            result.Save(stitchedImagePath);
                            Console.WriteLine(string.Format("Stitched in {0} milliseconds.", watch.ElapsedMilliseconds));
                        }
                        else
                        {
                            Console.WriteLine(string.Format("Stiching Error: {0}", stitchStatus));
                        }
                    }
                }
            }
            finally
            {
                foreach (Image<Bgr, Byte> img in sourceImages)
                {
                    img.Dispose();
                }
            }
        }
    }
}

  • imagePaths:待拼接的图片路径列表
  • stitchedImagePath:拼接好的图片保存路径
http://www.dtcms.com/a/117176.html

相关文章:

  • SpringBoot的简单介绍
  • Vue3实战八、路由权限和动态路由
  • 使用 Lua 脚本高效查询 Redis 键的内存占用
  • 【go】slice的浅拷贝和深拷贝
  • Python设计模式:适配模式
  • 2025 年江苏保安员职业资格考试经验分享​
  • starrocks split函数和trino split函数差异性
  • 【正点原子】如何设置 ATK-DLMP135 开发板 eth0 的开机默认 IP 地址
  • Windows RAC 集群故障:表决盘 “失踪” 致无法启动的排查实践
  • Docker部署Jenkins服务
  • ComfyUI模型下载与路径问题解决
  • IAGCN:登上《Nature》的深度学习可解释性情感分析模型突破
  • Appium的学习总结-Inspector参数设置和界面使用(5)
  • 【图像处理基石】什么是ISP色彩管理?
  • Android OpenCV 人脸识别 识别人脸框 识别人脸控件自定义
  • python小整数池和字符串贮存
  • Threejs实现天空盒效果
  • 前端单页应用性能优化全指南:从加载提速到极致体验
  • 《AI大模型趣味实战》智能财务助手系统配套说明:数据报表与指标手册
  • flink cdc的source数据流如何配置事件时间,如何设置时间语义,分配时间戳并生成水位线
  • JavaScript-异步和同步函数使用场景及区别-正确构建程序的核心要点
  • 3️⃣ Coze工作流基础教学(2025年全新版本)
  • 学习MySQL第七天
  • 使用Pholcus编写Go爬虫示例
  • 高数 | 用简单的话讲考研数学知识点(二重积分)
  • 是德科技KEYSIGHT校准件85039B
  • Kubernetes 集群搭建(二):搭建k8s集群 (1.28版本)
  • rustdesk折腾手记
  • Git 仓库在内网与 Gitee 间迁移及同步记录
  • 2025年客运从业资格证考试真题分享