单点抓放实践——使用VisionMaster和VisonPro交叉验证
本文是机器视觉2D引导定位的第五篇。本文讲述的核心内容是,综合之前的理论知识,练习使用VisionMaster进行单点抓放偏移计算,并用VisionPro自定义工具实现同样的功能。
标定
根据之前讲述的方法,执行12点标定(9点平移+3点旋转),并收集相应照片和对应的物理坐标:
Hik VisionMaster 得到的标定文件为:
<?xml version="1.0" encoding="UTF-8"?>
<CalibInfo>
<CalibInputParam>
<CalibParam ParamName="CreateCalibTime" DataType="string">
<ParamValue>2023-10-14 17:21:38</ParamValue>
</CalibParam>
<CalibParam ParamName="CalibType" DataType="string">
<ParamValue>NPointCalib</ParamValue>
</CalibParam>
<CalibParam ParamName="CameraMode" DataType="int">
<ParamValue>CameraStatic</ParamValue>
</CalibParam>
<CalibParam ParamName="TransNum" DataType="int">
<ParamValue>9</ParamValue>
</CalibParam>
<CalibParam ParamName="RotNum" DataType="int">
<ParamValue>3</ParamValue>
</CalibParam>
<CalibParam ParamName="CalibErrStatus" DataType="int">
<ParamValue>0</ParamValue>
</CalibParam>
<CalibParam ParamName="TransError" DataType="float">
<ParamValue>0.39129567</ParamValue>
</CalibParam>
<CalibParam ParamName="RotError" DataType="float">
<ParamValue>0.16232356</ParamValue>
</CalibParam>
<CalibParam ParamName="TransWorldError" DataType="float">
<ParamValue>0.041157886</ParamValue>
</CalibParam>
<CalibParam ParamName="RotWorldError" DataType="float">
<ParamValue>0.017073777</ParamValue>
</CalibParam>
<CalibParam ParamName="PixelPrecisionX" DataType="float">
<ParamValue>0.10520318</ParamValue>
</CalibParam>
<CalibParam ParamName="PixelPrecisionY" DataType="float">
<ParamValue>0.10516406</ParamValue>
</CalibParam>
<CalibParam ParamName="PixelPrecision" DataType="float">
<ParamValue>0.1051836</ParamValue>
</CalibParam>
<CalibPointFListParam ParamName="ImagePointLst" DataType="CalibPointList">
<PointF>
<X>2853.4529</X>
<Y>1789.2111</Y>
<R>-62.977718</R>
</PointF>
<PointF>
<X>2378.116</X>
<Y>1789.76</Y>
<R>-62.988041</R>
</PointF>
<PointF>
<X>2377.769</X>
<Y>1314.527</Y>
<R>-63.038883</R>
</PointF>
<PointF>
<X>2853.155</X>
<Y>1314.152</Y>
<R>-62.960419</R>
</PointF>
<PointF>
<X>3328.948</X>
<Y>1314.569</Y>
<R>-62.866886</R>
</PointF>
<PointF>
<X>3329.251</X>
<Y>1790.2</Y>
<R>-62.844543</R>
</PointF>
<PointF>
<X>3328.3669</X>
<Y>2265.4641</Y>
<R>-62.833302</R>
</PointF>
<PointF>
<X>2852.7241</X>
<Y>2265.137</Y>
<R>-62.88105</R>
</PointF>
<PointF>
<X>2378.125</X>
<Y>2264.73</Y>
<R>-62.940441</R>
</PointF>
<PointF>
<X>3022.7019</X>
<Y>1480.066</Y>
<R>-72.890045</R>
</PointF>
<PointF>
<X>2853.3931</X>
<Y>1789.679</Y>
<R>-62.955139</R>
</PointF>
<PointF>
<X>2632.2439</X>
<Y>2065.634</Y>
<R>-52.959534</R>
</PointF>
</CalibPointFListParam>
<CalibPointFListParam ParamName="WorldPointLst" DataType="CalibPointList">
<PointF>
<X>-318.22</X>
<Y>-542.19</Y>
<R>156.19</R>
</PointF>
<PointF>
<X>-268.22</X>
<Y>-542.19</Y>
<R>156.19</R>
</PointF>
<PointF>
<X>-268.22</X>
<Y>-592.20001</Y>
<R>156.19</R>
</PointF>
<PointF>
<X>-318.22</X>
<Y>-592.20001</Y>
<R>156.19</R>
</PointF>
<PointF>
<X>-368.22</X>
<Y>-592.20001</Y>
<R>156.19</R>
</PointF>
<PointF>
<X>-368.22</X>
<Y>-542.20001</Y>
<R>156.19</R>
</PointF>
<PointF>
<X>-368.22</X>
<Y>-492.20001</Y>
<R>156.19</R>
</PointF>
<PointF>
<X>-318.22</X>
<Y>-492.20001</Y>
<R>156.19</R>
</PointF>
<PointF>
<X>-268.22</X>
<Y>-492.20001</Y>
<R>156.19</R>
</PointF>
<PointF>
<X>-318.22</X>
<Y>-542.19</Y>
<R>166.19</R>
</PointF>
<PointF>
<X>-318.22</X>
<Y>-542.19</Y>
<R>156.19</R>
</PointF>
<PointF>
<X>-318.22</X>
<Y>-542.19</Y>
<R>146.19</R>
</PointF>
</CalibPointFListParam>
</CalibInputParam>
<CalibOutputParam>
<CalibParam ParamName="RotDirectionState" DataType="int">
<ParamValue>-1</ParamValue>
</CalibParam>
<CalibParam ParamName="IsRightCoorA" DataType="int">
<ParamValue>-1</ParamValue>
</CalibParam>
<PointF ParamName="RotCenterImagePoint" DataType="CalibPointF">
<RotCenterImagePointX>1168.2183</RotCenterImagePointX>
<RotCenterImagePointY>665.98157</RotCenterImagePointY>
<RotCenterImageR>-999</RotCenterImageR>
</PointF>
<PointF ParamName="RotCenterWorldPoint" DataType="CalibPointF">
<RotCenterWorldPointX>-122.94308</RotCenterWorldPointX>
<RotCenterWorldPointY>69.991859</RotCenterWorldPointY>
<RotCenterWorldR>-999</RotCenterWorldR>
</PointF>
<CalibFloatListParam ParamName="CalibMatrix" DataType="FloatList">
<ParamValue>-0.10520317</ParamValue>
<ParamValue>-6.4284381e-005</ParamValue>
<ParamValue>122.94308</ParamValue>
<ParamValue>-3.8910599e-005</ParamValue>
<ParamValue>0.10516404</ParamValue>
<ParamValue>-69.991859</ParamValue>
<ParamValue>0</ParamValue>
<ParamValue>0</ParamValue>
<ParamValue>1</ParamValue>
</CalibFloatListParam>
</CalibOutputParam>
</CalibInfo>
生产过程
在生产阶段,我们将针对如下来料图片,计算机器人的单点抓放相对偏移。
我们会分别使用海康的Vision Master和Cognex的VisionPro进行计算。
- 由于海康的VisionMaster已经内置了单点抓放功能,我们直接使用现成的工具模块
- Cognex的VisionPro并没有提供单点抓放功能,但是由于Cognex允许我们直接编写
C#
代码,我们可以按照前几篇文章中推导的理论,自己编程实现。(此处,我编写了自己的VisionPro单点抓放工具)
我针对10组来料图像,分别使用VisionMaster自带的单点抓放功能和我自定义的VisionPro单点抓放工具,进行了交叉验证。比对显示,二者结果几乎一致(参见如下截图)。
第一组
VisionMaster结果:
VisionPro结果:
第二组
VisionMaster结果:
VisionPro结果:
第三组
VisionMaster结果:
VisionPro结果:
第四组
VisionMaster结果:
VisionPro结果:
第五组
VisionMaster结果:
VisionPro结果:
第六组
VisionMaster结果:
VisionPro结果:
第七组
VisionMaster结果:
VisionPro结果:
第八组
VisionMaster结果:
VisionPro结果:
第九组
VisionMaster结果:
VisionPro结果:
第十组
VisionMaster结果:
VisionPro结果: