VisionPro软件Image Stitch拼接算法

2D图像拼接的3种情景

1.一只相机取像位置固定,或者多只相机固定位置拍图,硬拷贝拼图,采用CopyRegion工具实现
2.一只或多只相机在多个位置拍照,相机视野互相重叠,基于Patmax特征定位后,无缝
拼图;采用CogImageStitch类实现;
3.一只或多只相机在多个位置拍照,相机视野只有小范围重叠,或者不重叠,无法使用 Patmax特征定位,可以用标定板标定位置关系,使用CogImageStitch类实现拼图.

注意:此方法是是预先标定的位置关系,如果采用1只相机多个位置拍摄,需要机构保证重复运动的精度在允许范围内,否则可能造成图像错位。

注意:无论是哪种拼接方式,单相机或是多相机拍照,都需要尽量调节到同一个高度拍照,否则可能造成图像重影,模糊等问题;

1.CopyRegionTool硬拷贝拼图

1.请参考QuickBuild自带例程: Script_Stitch_Job.vpp
2.在CogJob的作业属性-取像脚本中实现多张图像拷 贝拼接
3.注意CopyRegion工具的属性, DesinationImageAlignmentX和Y用于指定子图像在拼接大图的位置偏移

在这里插入图片描述

2.基于互相重叠的Patmax特征无缝拼接

请参考“TB_Patmax算法拼.vpp”; 此VPP实现3张图像上下拼接,其他拼接组合可以自行改写程序

流程:
1).添加Patmax工具,训练各个重叠特征;注意相邻的两张图同样的特征使用同一个Patmax工具即可;
2).载入第一张图像,运行整个CogJob,将图像给到TB_StitchImage1,Patmax定位结果给到Image1Pose1;注意不要用连线;
3).对其他图像重复同样的工作,中间的图像有两个PMA结果,需要连2个Pose;
4).TB_Stitch输出的图像即为拼接后图。

在这里插入图片描述
在这里插入图片描述
这里CogImageStitch类使用的方法:

1).AllocateBlendingBuffer,指定图像大小为拼接后图的尺寸,Transform不需要特别设置,在(0,0)附近即可,Scale为1;  
2).分别为3张图建立CogTransform2DLinear;第一个Transform建立在(0,0)位置, 其他图Transform关系依次Compose 前一个相邻Pose的Invert,因为后一个是依据前一个的位置关系来偏移的。以上下3张图拼接为例,就建立了图示的关系;         
3).将图像和Tansform关系分别传入不同的CogFixtureTool,在图像中添加对应的坐标系。注意坐标系名称不能一样;或者用代码AddSpace手动添加坐标系也可以;
4).生成的带新坐标系的图像传入CogImageStitch工具,用BlendImageIntoBuffer方法,会将每张图像对应添加到拼接大图的对
应位置。
5).调用FillDestinationImageFromBuffer来生成拼接图,完成。

注意BlendImageInfoBuffer和OverwriteImage两种方法的区别,Overwrite在像素重叠部分是互相覆盖了,而Blend模式是按照不同权重混合起来,因此更接近无缝拼接。

详细代码如下:

public override bool GroupRun(ref string message, ref CogToolResultConstants result){// To let the execution stop in this script when a debugger is attached, uncomment the following lines.// #if DEBUG// if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break();// #endifCogImage8Grey Img1 =(CogImage8Grey) this.Inputs.Image1;CogImage8Grey Img2 =(CogImage8Grey) this.Inputs.Image2;CogImage8Grey Img3 =(CogImage8Grey) this.Inputs.Image3;CogImage8Grey StitchedImg = new CogImage8Grey(Img1.Width+500, Img1.Height * 3);CogImageStitch mStitch = new CogImageStitch();//  CogImageStitch.FillDefaultWeightImage(StitchedImg);CogImage8Grey imgMask0 = new CogImage8Grey(Img1.Width, Img1.Height);CogImageStitch.FillDefaultWeightImage(imgMask0);CogImage8Grey imgMask1 = new CogImage8Grey(Img1.Width, Img1.Height);CogImageStitch.FillDefaultWeightImage(imgMask1);CogImage8Grey imgMask2 = new CogImage8Grey(Img1.Width, Img1.Height);CogImageStitch.FillDefaultWeightImage(imgMask2);CogTransform2DLinear trans = new CogTransform2DLinear();trans.Scaling = 1;trans.TranslationX = 10;trans.TranslationY = 10;mStitch.AllocateBlendingBuffer(Img1.Width+500, Img1.Height * 3, trans);CogCoordinateSpaceTree mSpace1 = Img1.CoordinateSpaceTree;CogCoordinateSpaceTree mSpace2 = Img2.CoordinateSpaceTree;CogCoordinateSpaceTree mSpace3 = Img3.CoordinateSpaceTree;CogTransform2DLinear mTrans1 =new CogTransform2DLinear();mTrans1.Scaling = 1;mTrans1.TranslationX = 0;mTrans1.TranslationY = 0;mTrans1.Rotation = 0;//   mSpace1.AddSpace("@", "foo_0", mTrans1, true, CogAddSpaceConstants.ReplaceDuplicate);CogTransform2DLinear mTrans2 =this.Inputs.Image2Pose1.Compose(this.Inputs.Image1Pose1.Invert());//   mSpace2.AddSpace("@", "foo_1", mTrans2, true, CogAddSpaceConstants.ReplaceDuplicate);CogTransform2DLinear mTrans3 = this.Inputs.Image3Pose2.Compose(this.Inputs.Image2Pose2.Invert()).Compose(mTrans2);//   mSpace3.AddSpace("@", "foo_2", mTrans3, true, CogAddSpaceConstants.ReplaceDuplicate);/*   mStitch.BlendImageIntoBuffer(Img1, null);mStitch.BlendImageIntoBuffer(Img2, null);mStitch.BlendImageIntoBuffer(Img3, null);*/   this.Tools.CogFixtureTool1.RunParams.UnfixturedFromFixturedTransform = mTrans1;this.Tools.CogFixtureTool1.Run();this.Tools.CogFixtureTool2.RunParams.UnfixturedFromFixturedTransform = mTrans2;this.Tools.CogFixtureTool2.Run();this.Tools.CogFixtureTool3.RunParams.UnfixturedFromFixturedTransform = mTrans3;this.Tools.CogFixtureTool3.Run();mStitch.BlendImageIntoBuffer((CogImage8Grey)this.Tools.CogFixtureTool1.OutputImage, imgMask0);mStitch.BlendImageIntoBuffer((CogImage8Grey)this.Tools.CogFixtureTool2.OutputImage,imgMask1);mStitch.BlendImageIntoBuffer((CogImage8Grey)this.Tools.CogFixtureTool3.OutputImage,imgMask2);    mStitch.FillDestinationImageFromBuffer(StitchedImg);//  MessageBox.Show(mTrans3.TranslationX.ToString() + "   " + mTrans3.TranslationY.ToString());this.Outputs.StitchedImage = StitchedImg;return false;}

3.使用标定板拼接

请参考“TB_标定板拼.vpp”; 此VPP实现3张图像上下拼接,其他拼接组合可以自行改写程序,标定板可以使用二维码标定板,也可以用Cognex标准标定板;
如果使用二维码标定板,不要求视野重叠,使用带 Cognex标记的标定板,则需要视野重叠,以便于各个拍照位置建立统一的标定板坐标系。

流程如下:

1).标定板放好,固定不动。大小要能够覆盖整个拍照视野范围 2).3只相机或同一个相机的3个位置对标定板拍照,执行。
CheckBoard标定;得到outputImage和OutputImageMask;注意此时每张图的输出坐标系都是标定片坐标系;
3).打开距离标定板坐标系原点最近的那张图,获取坐标原点在Root
space下的X和Y坐标值;利用标定板图计算图像的像素坐标与标定板坐标系的比例关系;分别输入到 ToolBlock的dScale,dTransX, dTransY中;
4).执行ToolBlock,即可得到拼接后图像。

在这里插入图片描述

CogImageStitch类使用的方法:

1).由于各张子图像已经采用标定板建立了标定板坐标系,因此前面特征拼接方法不同的是,这里不需要再自行建立坐标系关系,使用标定板坐标系即可;
2).但是在AllocateBlendingBuffer时,需要指定RootFromBlendingBuffer的坐标系变换关系。由于BlendingBuffer分配时使用的标定板坐标系,而图像是从rootspace下copy像素,因此变换关系的比例和Translation需要在定义BlendingBuffer时指定。
3)其他部分按照CogImageStitch的使用方法调用即可。

详细代码如下

public override bool GroupRun(ref string message, ref CogToolResultConstants result){// To let the execution stop in this script when a debugger is attached, uncomment the following lines.// #if DEBUG// if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break();// #endifCogImage8Grey Img1 =(CogImage8Grey) this.Inputs.Image1;CogImage8Grey Img2 =(CogImage8Grey) this.Inputs.Image2;CogImage8Grey Img3 =(CogImage8Grey) this.Inputs.Image3;CogImage8Grey imgMask0 = (CogImage8Grey) this.Inputs.CalibMask1;CogImage8Grey imgMask1 = (CogImage8Grey) this.Inputs.CalibMask2;CogImage8Grey imgMask2 = (CogImage8Grey) this.Inputs.CalibMask3;CogImage8Grey StitchedImg = new CogImage8Grey(Img1.Width+500, Img1.Height * 3+500);CogImageStitch mStitch = new CogImageStitch();//  CogImageStitch.FillDefaultWeightImage(StitchedImg);CogImage8Grey imgWeight0 = new CogImage8Grey(Img1.Width, Img1.Height);CogImageStitch.FillDefaultWeightImage(imgWeight0);CogImage8Grey imgWeight1 = new CogImage8Grey(Img2.Width, Img2.Height);CogImageStitch.FillDefaultWeightImage(imgWeight1);CogImage8Grey imgWeight2 = new CogImage8Grey(Img3.Width, Img3.Height);CogImageStitch.FillDefaultWeightImage(imgWeight2);CogTransform2DLinear trans = new CogTransform2DLinear();trans.Scaling = this.Inputs.dScale;trans.TranslationX = this.Inputs.dTransX;trans.TranslationY = this.Inputs.dTransY;mStitch.AllocateBlendingBuffer(Img1.Width+500, Img1.Height * 3+500, trans);mStitch.BlendImageIntoBuffer(Img1, imgWeight0,imgMask0,0,0);mStitch.BlendImageIntoBuffer(Img2,imgWeight1,imgMask1,0,0);mStitch.BlendImageIntoBuffer(Img3,imgWeight2,imgMask2,0,0);    mStitch.FillDestinationImageFromBuffer(StitchedImg);//  MessageBox.Show(mTrans3.TranslationX.ToString() + "   " + mTrans3.TranslationY.ToString());this.Tools.CogBlobTool1.InputImage = StitchedImg;this.Tools.CogBlobTool1.Run();return false;}

总结:
1.小视野多次取像,每张图片单独使用检测工具,精度可满足需求;
不够直观,调试复杂;
2.小视野多次取像,根据标定结果,进行图像拼接;
精度可满足需求;同时更加直观,客户接受度高;检测工具使用更加方便;后期维护及设备复制更省心;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“多维像素”多模态雷视融合技术构建自动驾驶超级感知能力|上海昱感微电子创始人蒋宏GADS演讲预告

2025年1月14日,第四届全球自动驾驶峰会将在北京中关村国家自主创新示范区展示交易中心-会议中心举行。经过三年的发展,全球自动驾驶峰会已经成长为国内自动驾驶领域最具影响力、规模最大的产业峰会之一。在主会场下午的城市NOA专题论坛上,上海…

C语言初阶习题【25】strcpy的模拟实现

1. 首先先调用下库函数,看它实现了什么 2. 我们自己实现一个strcpy函数 3. 改进1 把*destnation和source 写上去,使用后置 4. 改进2 这里直接把赋值操作放到了while的判断条件里面,然后while循环语句什么都不做,放了一个空语句…

使用 SQL 和表格数据进行问答和 RAG(6)—将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库

将指定目录下的 CSV 或 Excel 文件导入 SQLite 数据库。以下是详细代码逻辑: 1. 类结构 该类包含三个主要方法: _prepare_db:负责将文件夹中的 CSV 和 XLSX 文件转换为 SQL 表。_validate_db:用于验证 SQL 数据库中创建的表是否…

设计模式 行为型 策略模式(Strategy Pattern)与 常见技术框架应用 解析

策略模式(Strategy Pattern)核心思想是将算法的实现从使用该算法的类中分离出来,作为独立的对象,通过接口来定义算法家族,这样就可以很容易地改变或扩展算法。通过这种方式,可以避免在客户端代码中使用大量…

如何操作github,gitee,gitcode三个git平台建立镜像仓库机制,这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈

如何操作github,gitee,gitcode三个git平台建立镜像仓库机制,这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈 问题背景 由于我司最早期19年使用的是gitee,因此大部分仓库都在gitee有几百个库的代码,…

B+树的原理及实现

文章目录 B树的原理及实现一、引言二、B树的特性1、结构特点2、节点类型3、阶数 三、B树的Java实现1、节点实现2、B树操作2.1、搜索2.2、插入2.3、删除2.4、遍历 3、B树的Java实现示例 四、总结 B树的原理及实现 一、引言 B树是一种基于B树的树形数据结构,它在数据…

大纲笔记幕布的替换

文章目录 前言类似的大纲软件探索 DynalistLogseq通过国内代码仓库建立 Git 仓库Logseq 的使用PC 端安卓端Git 操作Termux git 步骤Termux 的桌面组件:Termux widget 报错参考 前言 之前我一直用幕布,买了三年,奈何要过期了,又三…

MoEs and Transformers 笔记

ref:https://huggingface.co/blog/zh/moe#%E7%94%A8router-z-loss%E7%A8%B3%E5%AE%9A%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83 MoEs and Transformers Transformer 类模型明确表明,增加参数数量可以提高性能,因此谷歌使用 GShard 尝试将 Transformer 模型…

ubuntu为Docker配置代理

终端代理 我们平常在ubuntu终端中使用curl或git命令时,往往会很慢。 所以,首先需要给ubuntu终端环境添加代理。 查看自身那个软件的端口号,我这里是7890。 sudo gedit ~/.bashrcexport http_proxyhttp://localhost:7890 export https_pr…

【安卓开发】【Android Studio】项目构建失败提示【Could not read metadata.bin】解决方法

一、问题说明 在Android Studio中开发安卓项目时,项目构建失败,提示如下: Could not read workspace data from xxx/xxx/(某个目录,和gradle有关):could not read ...metadata.bin&#xff08…

EXCEL: (二) 常用图表

10. 图表 134-添加.删除图表元素 图表很少是一个单独的整体,而是由十几种元素/对象拼凑出来的。 学习图表就是学习当中各类元素的插删改。 ①图表中主要元素的定义 图表上的一个颜色就是一个系列。 横轴是分类轴,将每个系列都分为几类。 ②选中图…

sys.dm_exec_connections:查询与 SQL Server 实例建立的连接有关的信息以及每个连接的详细信息(客户端ip)

文章目录 引言I 基于dm_exec_connections查询客户端ip权限物理联接时间范围dm_exec_connections表see also: 监视SQL Server 内存使用量资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)引言 查询历史数据库客户端ip应用场景: 安全分析缺乏…

阿里云发现后门webshell,怎么处理,怎么解决?

当收到如下阿里云通知邮件时,大部分管理员都会心里一惊吧!出现Webshell,大概是网站被入侵了。 尊敬的 xxxaliyun.com: 云盾云安全中心检测到您的服务器:47.108.x.xx(xx机)出现了紧急安全事件…

【大模型】百度千帆大模型对接LangChain使用详解

目录 一、前言 二、LangChain架构与核心组件 2.1 LangChain 核心架构 2.2 LangChain 核心组件 三、环境准备 3.1 前置准备 3.1.1 创建应用并获取apikey 3.1.2 开通付费功能 3.2 获取LangChain文档 3.3 安装LangChain依赖包 四、百度千帆大模型对接 LangChain 4.1 LL…

maven如何从外部导包

1.找到你项目的文件位置,将外部要导入的包复制粘贴进你当前要导入的项目下。 2.从你的项目目录下选中要导入的包的pom文件即可导包成功 注意一定是选中对应的pom文件 导入成功之后对应的pom.xml文件就会被点亮

graylog配置日志关键字邮件Email告警

文章目录 前言一、配置邮箱报警二、邮件告警配置1.设置邮箱告警通知2.设置告警事件 三、告警结果示例 前言 在TO/B、TO/C项目的告警链路中,端口告警、服务器基础资源告警、接口告警等不同类型的告警都扮演着重要角色。这些告警能够帮助团队及时发现潜在的系统问题&…

GraphQL:强大的API查询语言

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

集合卡尔曼滤波ENKF的学习笔记

集合卡尔曼滤波ENKF的学习笔记 什么是数据同化?天气模型预测是25C(这叫"背景场"),实际观测是23C(这叫"观测值"),数据同化就是把这两个信息合理结合。 # 最简单的组合方式&…

DeepSeek-V3 通俗详解:从诞生到优势,以及与 GPT-4o 的对比

1. DeepSeek 的前世今生 1.1 什么是 DeepSeek? DeepSeek 是一家专注于人工智能技术研发的公司,致力于打造高性能、低成本的 AI 模型。它的目标是让 AI 技术更加普惠,让更多人能够用上强大的 AI 工具。 1.2 DeepSeek-V3 的诞生 DeepSeek-V…

UI自动化测试保姆级教程--pytest详解(精简易懂)

欢迎来到啊妮莫的学习小屋 别让过去的悲伤,毁掉当下的快乐一《借东西的小人阿莉埃蒂》 简介 pytest是一个用于Python的测试框架, 支持简单的单元测试和复杂的功能测试. 和Python自带的UnitTest框架类似, 但是相比于UnitTest更加简洁, 效率更高. 特点 非常容易上手…