使用标定板标定像素当量

1. 了解标定板的参数

拿到一块标定板,我们应该如何使用它,或者说该如何了解它的相关参数呢?如果你使用的是标准的圆点标定板,可以参考这篇博客:Halcon 圆形标定板标定基本流程-标定助手操作
但是像下面这个长方形的标定板,上面并没有标注我们需要的信息,所以需要我们自己去量出来。我们要测量的最重要的参数就是点间距和点的直径,可以使用刻度尺,也可以使用游标卡尺,测量工具的精度并不重要,因为标定板点间距和点直径大概率是一个规整的数字。
比如我们使用刻度尺测量从上到下测量,然后再数出一共有多少个间距,这样就能计算出点间距了。下面这块标定板,大直径圆点纵向点间距是8mm,横向点间距是4mm,大点的直径是2mm。有了这些参数,我们就可以使用它来标定相机的像素当量了。

在这里插入图片描述

2. 确定标定的方法

首先必须要注意的是,标定板标定的像素当量,是仅针对某一平面的,而且忽略了镜头的畸变。如果被测平面与相机的相对距离发生了改变,像素当量就会失效。
其次还要注意一点,标定出来的行方向和列方向的像素当量并不相等,原因也非常简单,因为你是无法让相机完全垂直于被测平面的。甚至有时相机还会倾斜安装,不过只要我们标定好了对应方向的像素当量,那么使用它来测量尺寸就不会有问题。(举个例子:给人拍照时,蹲下从下往上拍,会显得人腿长,这是因为,纵向方向的像素当量更大了)
下面举一个标定的实例,标定板被挡住一部分,但是这并不影响标定。
在这里插入图片描述

标定的思路是:拍照——分割圆点——计算圆点行数和列数——计算像素当量
在这里插入图片描述

在这里插入图片描述

3. Halcon代码示例

read_image (Cal, 'b1')

DotCalibrationPlate (Cal, RegionUnion, pixelAccuracyX, pixelAccuracyY)

dev_display (Cal)
dev_display (RegionUnion)
disp_message (3600, 'X方向像素当量:'+pixelAccuracyX, 'window', 12, 12, 'black', 'true')
disp_message (3600, 'Y方向像素当量:'+pixelAccuracyY, 'window', 42, 12, 'black', 'true')
  • DotCalibrationPlate
*将标定板上的圆点区域抠图
threshold (Cal, Regions, 0, 154)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions1, 'area', 'and', 1000, 3000)
fill_up (SelectedRegions1, RegionFillUp)
select_shape (RegionFillUp, SelectedRegions2, 'roundness', 'and', 0.73303, 1)

union1 (SelectedRegions2, RegionUnion)
shape_trans (RegionUnion, RegionTrans, 'convex')

inner_rectangle1 (RegionTrans, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
dilation_rectangle1 (Rectangle, RegionDilation, 200, 200)
reduce_domain (Cal, RegionDilation, ImageReduced)

*计算圆点所构成的区域的长和宽
threshold (ImageReduced, Regions, 0, 154)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions1, 'area', 'and', 1000, 3000)
fill_up (SelectedRegions1, RegionFillUp)
select_shape (RegionFillUp, SelectedRegions2, 'roundness', 'and', 0.73303, 1)

count_obj (SelectedRegions2, PointNum)
colNum:=5
RowNum:=PointNum/colNum

union1 (SelectedRegions2, RegionUnion)
smallest_rectangle2 (RegionUnion, Row, Column, Phi, Length1, Length2)

*判断标定板摆放的角度,如果角度偏太多应该退出标定
if (abs(abs(deg(Phi)) - 90) < 5)
    LX:=4*(colNum-1)+2
    LY:=8*(RowNum-1)+2

    pixelAccuracyX:=LX/(Length2*2)
    pixelAccuracyY:=LY/(Length1*2)
else
    pixelAccuracyX:=0
    pixelAccuracyY:=0
endif
return ()


版权声明:本文为CSDN博主「MechMaster」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38566632/article/details/122466244