一、设计任务
摄像机标定要求自制标定板,使用网络摄像机或手机摄像头进行标定。将标定的摄像机内参和外参进行保存。设计测量方案,使用标定过的摄像机对包含图像能识别的垂直边缘的物品(直尺,画直线的纸张等),进行距离或边长的测量。标定过程和测量过程,均需要保持摄像机与测量平面之间的距离固定,物品高度不能过高,否则影响测量结果。给出设计的中间过程和截图以及最终测量结果,并对测量结果进行误差计算和分析。
二、总体方案
2.1 测量设备设计
根据设计任务,选择如图1所示的USB相机进行相机的标定和实物的测量,相机固定在标定板上方,垂直照射标定板获得视域的图像。所测的物品包括直尺一把和激光加工的物料块一个,由于从上方照射金属物料块会形成反光,造成局部的阈值直方图错误,影响后来dark to light和light to dark的识别错误,故选择底部打光,使用12V的灯条接稳压源从下方打光,透过亚克力板(这里要使用带塑料膜的亚克力板,如果不用膜的话相机入光太多亮度不够,如果使用白纸的话由于白纸密度不均匀,会产生很多的噪声,需要进行平滑处理,但是效果比较差)照射被测物体,可以实现很好的照射效果以及物料和周围的对比,有效地提高测量的精度。
图1 标定和测量设备实物图
本次测量选择30*30mm的标准标定板进行标定,其参数为:黑色原点:7*7;边框长度:30*30mm;内边框长度:28.125mm*28.125mm;黑色原点半径:0.9375mm;原点中心间距:3.75mm;裁剪宽度:30.75*30.75mm。在Halcon中用gen_caltab(::XNum,YNum,MarkDist,DiameterRatio,CalTabDescrFile,CalTabPSFile:)算子来制作标定板,生成的.descr文件为标定板描述文件,.ps文件为标定板图形文件,可以用photoshop打开,要用分辨率*10打开,否则黑色原点是模糊的,Halcon识别不到标定板。
2.2 测量程序设计
在获得USB相机采集后的图像,选取8-10张导入到catlab的文件中,并进行与程序匹配的命名。然后依照图2进行标定。
图2 标定流程图
标定完成后对图像进行测量,导入被测物体采集的图像,具体的采集过程如图3所示。
图3 测量流程图
使用image_points_to_world_plane命令是因为前面有set_origin_pose (Pose, 0, 0,0, Pose)设置了初始姿态,这里要将空间中的点转为平面上的点进行处理。
三、各功能模块设计及结果图
本次设计中共使用了两种被测物体,直尺的测量比较简单,物料块的测量较为复杂。本节中将介绍两个测量方案的实施。本设计在原有的基础上对例程进行了一定的优化。
3.1 直尺的测量
ImgPath := '3d_machine_vision/calib4/'
read_image(Sample,ImgPath + 'calib_' + '01')
get_image_size(Sample,SampleWidth,SampleHeight)
dev_close_window ()
dev_open_window (0, 0, SampleWidth/4, SampleHeight/4, 'black', WindowHandle)
▶这里进行了相机初始值和标定板的设置。
NumImages := 8
for I := 1 to NumImages by 1
read_image (Image, ImgPath + 'calib_' + I$'02d')
dev_display (Image)
find_calib_object (Image, CalibDataID, 0, 0, I, [], [])
get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)
dev_set_color ('green')
dev_display (Caltab)
Endfor
▶这里进行多张图的标定,如图4所示,目的是修整相机的内参,获得相机的外参,容易发生两个问题,第一个错误代码是can’t find feature找不到标定板,这个有可能是PS没有高分辨率打开,标定板模糊精度低