为了得到二维平面像素坐标和三维世界坐标的关系,从而进行三维重建,必须进行单相机标定。
实现的原理是根据相机的像元尺寸、焦距和标定板的描述文件(.descr)来找到显示的标定板图像上面的标志点,从而确定标定板实际输入的参数(Distance、Diameter等)和这些参数对应的图像像素大小的关系,完成标定。
这里我用的标定板是7*7圆点标定板,型号:HC070—3.75,也可自行打印(.ps)文件。
标定板数据可参考:
标定步骤:
*相机内参
CameraParameters := [0.0375147,-270.806,8.30152e-006,8.3e-006,647.48,520.914,1280,960]
*相机位姿,即外参(旋转矩阵+平移矢量)
CameraPose := [-0.0091626,-0.00625214,0.700967,2.46926,358.933,179.443,0]
*1、校正径向畸变,得到新的相机内参
change_radial_distortion_cam_par ('adaptive', CameraParameters, 0, CamParamOut)
stop ()
* Image Acquisition 02: Code generated by Image Acquisition 02
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', 'CAMERA_QBY_DM', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while (true)
grab_image_async (Image, AcqHandle, -1)
*2、对发生径向畸变的图像生成投影映射,图像的映射数据存在第一个参数中
gen_radial_distortion_map (Map, CameraParameters, CamParamOut, 'bilinear')
*3、对图像进行畸变校正
map_image (Image, Map, ImageMapped)
endwhile
close_framegrabber (AcqHandle)
注意:相机标定之后,相机焦距、上下位置不能再动,否则需要重新标定。
* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', 8, 'gray', -1, 'false', 'default', 'c42f90f4615e_Hikvision_MVCA05020GM', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while (true)
* 1.采集
grab_image_async (Image, AcqHandle, -1)
* 2.预处理
rgb1_to_gray (Image, GrayImage)
* 3.分割
threshold (Image, Regions, 21, 68)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['area','circularity'], 'and', [458.72,0.8798], [16972.5,1])
* 按照字符行排序
sort_region (SelectedRegions, SortedRegions, 'character', 'true', 'row')
* 4.中心点计算
area_center (SortedRegions, Area, Row, Column)
endwhile
close_framegrabber (AcqHandle)
vector_to_hom_mat2d(Column,Row,Column1,Row1,HomMat2D)
* Row2,Column2为blob分析后得到的目标像素坐标
* Qx,Qy 为通过映射矩阵得到的机械手坐标
affine_trans_point_2d(HomMat2D,Row2,Column2,Qy,Qx)
参考:Halcon 单相机标定