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

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.小视野多次取像,根据标定结果,进行图像拼接;
精度可满足需求;同时更加直观,客户接受度高;检测工具使用更加方便;后期维护及设备复制更省心;

相关文章:

VisionPro软件Image Stitch拼接算法

2D图像拼接的3种情景 1.一只相机取像位置固定,或者多只相机固定位置拍图,硬拷贝拼图,采用CopyRegion工具实现 2.一只或多只相机在多个位置拍照,相机视野互相重叠,基于Patmax特征定位后,无缝 拼图&#xff…...

【从零开始入门unity游戏开发之——unity篇09】unity6基础入门——Unity游戏对象和组件的本质、Unity中的反射机制

文章目录 一、Unity游戏对象和组件的本质1、开发游戏的本质2、万物之根本——空对象2.1 什么是空对象?2.2 创建空对象 3、Unity游戏对象的本质4、 transform组件4.1 transform组件的重要性4.2 修改transform的值4.4 **Transform的作用**4.3 重置transform的值 5、总…...

【Linux】深入理解文件系统(超详细)

目录 一.磁盘 1-1 磁盘、服务器、机柜、机房 📌补充: 📌通常网络中用高低电平,磁盘中用磁化方向来表示。以下是具体说明: 📌如果有一块磁盘要进行销毁该怎么办? 1-2 磁盘存储结构 ​编辑…...

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 模型…...

在Linux中,如何禁用root用户直接SSH登录?

在Linux中禁用root用户的直接SSH登录是为了增强系统的安全性,因为允许root用户通过SSH远程登录会增加服务器被暴力破解的风险。以下是在Linux系统中禁止root用户直接SSH登录的步骤: 编辑SSH配置文件: 打开/etc/ssh/sshd_config文件&#xff…...

用Python实现简单的任务自动化

目录 1. 自动发送邮件提醒 2. 自动备份文件 3. 自动下载网页内容 总结 在现代工作和生活中,任务自动化可以极大地提高效率和准确性。Python,作为一种功能强大且易于学习的编程语言,是实现任务自动化的理想选择。本文将通过几个简单而实用的案例,展示如何用Python实现任…...

为AI聊天工具添加一个知识系统 之26 资源存储库和资源管理器

本文要点 资源存储库 为了能完成本项目(“为AI聊天工具增加一个知识系统”,其核心能力是“语言处理” ,该能力的最大挑战 当仁不让的应该是自然语言处理)的设计,我们考虑一个问题:在自然语言处理中&#…...

Windows10环境下安装RabbitMq折腾记

最近有个老项目需要迁移到windows10环境,用的是比较老的rabbitmq安装包,如下所示。经过一番折腾,死活服务起不来,最终果断放弃老版本启用新版本。现在把折腾过程记录下: 一、安装erlang 安装完成后的目录结构&#xff…...

对快速由表及里说拜拜/如何正确运用由表及里

你是不是还:看到一男子拖走一女子就以为小情侣吵架而已(可能人贩子);看到男友对你好个几次就从此死心塌地(可能有手就行,细节装装而已)结果耽误终身;看到女同事对你微笑不排斥就以为…...

spring mvc源码学习笔记之八

本文说点儿简单的。 如果你想研究基于 XML 配置的 spring mvc 的话,可以简单扫一眼本文。 在基于 XML 配置的 spring mvc 开发中,我们主要就是通过 spring 提供的各种标签来配置。 但是,大家是不是都有个疑问,spring 到底给我们提…...

探秘5网口IIOT网关

在当今这个科技飞速发展的时代,工业领域正经历着一场深刻的变革,而工业物联网网关在其中扮演着至关重要的角色。 什么是IIOT网关 工业物联网网关,简单来说,就是连接工业现场设备与云端或者上层管理系统的关键桥梁。 而明达技术研…...

左神算法基础巩固--5

文章目录 前缀树生成前缀树查询前缀树查询字符串加入过几次查询所有加入的字符串中,有几个是以pre这个字符串作为前缀 删除前缀树中的某个字符串 贪心算法解题 前缀树 生成前缀树 要想生成一棵前缀树,需要先创建一个根节点,这个根节点有26条…...

Python的Matplotlib库应用(超详细教程)

目录 一、环境搭建 1.1 配置matplotlib库 1.2 配置seaborn库 1.3 配置Skimage库 二、二维图像 2.1 曲线(直线)可视化 2.2 曲线(虚线)可视化 2.3 直方图 2.4 阶梯图 三、三维图像 3.1 3D曲面图 3.2 3D散点图 3.3 3D散…...

负载均衡服务器要怎么配置?

目录 一、概述: 二、硬件配置: 三、操作系统配置: 四、负载均衡软件: 五、网络配置: 六、软件安装步骤: 6.1 安装 Nginx 6.2 安装 LVS 6.3 安装 HAProxy 6.4 安装 Keepalived 一、概述&#xff1…...

CANopen转EtherCAT网关连接伺服驱动

在现代工业自动化领域,CANopen和EtherCAT是两种常见的通信协议,各自在不同的应用场景中发挥着重要作用。然而,随着工业自动化系统的日益复杂化,不同设备间的通信需求也变得多样化。因此,如何实现不同协议设备之间的无缝…...

自动化测试脚本实践:基于 Bash 的模块化测试框架

前言 在现代软件开发中,测试自动化是确保软件质量和稳定性的核心手段之一。随着开发周期的缩短和功能模块的增多,手动测试逐渐无法满足高效性和准确性的需求。因此,测试人员需要依赖自动化工具来提升测试效率,减少人为干预和错误。…...

WebSocket 测试入门篇

Websocket 是一种用于 H5 浏览器的实时通讯协议,可以做到数据的实时推送,可适用于广泛的工作环境,例如客服系统、物联网数据传输系统, 基础介绍 我们平常接触最多的是 http 协议的接口,http 协议是请求与响应的模式&…...

Apache Traffic存在SQL注入漏洞(CVE-2024-45387)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

Centos7使用yum工具出现 Could not resolve host: mirrorlist.centos.org

在 CentOS 7 中使用 yum 工具时,出现 "Could not resolve host: mirrorlist.centos.org" 的错误,一般情况是因为默认的镜像源无法访问。 以下是一些常用的解决方法: 检查网络连接:首先使用 ping 命令测试网络连接是否…...

zookeeper shell操作和zookeeper 典型应用(配置中心、集群选举服务、分布式锁)

文章目录 引言I zookeeper客户端命令查看子节点 ls创建子节点 create获取节点信息 get更新节点数据 set删除节点 delete\ rmrII 监听机制node1:设置监听node3:修改监听节点node1:得到监听反馈III zookeeper 典型应用分布式锁集群选举服务数据发布/订阅(配置中心)引言 zk 的…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...