1.生成標定板 文件ps格式,可通過ps軟件打印出來, 以及標定板的描述文件descr格式
gen_caltab (7, 7, 0.0125, 0.5, 'caltab.descr', 'caltab.ps')
2.打開標定助手進行標定:輸入相機像素尺寸,焦距參數,加載描述文件,移動標定板到整個視野的不同地方,旋轉不同的角度進行采集,采集到十張左右就差不多了,然后選擇其中一張為參考位姿,即世界坐標系,最后標定。標定完最好在結果欄中勾選原點在圖像角上,則世界坐標系和像素坐標系就重合了,此時像素和實際距離只是比例關系了。
3.生成代碼並插入代碼
1 *標定得到的相機參數 2 CameraParameters := [0.189115,87.4045,2.21885e-006,2.2e-006,2700.85,-118.133,2592,1944] 3 *相機在世界坐標系中的位姿 4 CameraPose := [-0.344824,0.0149449,10.9193,0.721803,4.27061,0.733757,0] 5 stop ()
4.像素坐標系轉換為世界坐標系
1 *像素坐標系到世界坐標系轉換(通過比例換算可知道每個像素長度實際代表多少毫米) 2 *第一個參數為相機參數,第二個參數為相機位姿,第五個參數為計量單位,一般選mm,即100個像素尺寸實際長為X個mm 3 image_points_to_world_plane (CameraParameters, CameraPose, 100, 100, 'mm', X, Y)
5.測量
1 *打開相機對待側物體進行測量 2 open_framegrabber ('DahengCAM', 1, 1, 0, 0, 0, 0, 'interlaced', 8, 'gray', -1, 'false', 'HV-xx51', '1', 1, -1, AcqHandle) 3 grab_image_start (AcqHandle, -1) 4 wait_seconds (1) 5 grab_image_async (Image, AcqHandle, -1) 6 dev_display (Image) 7
8 threshold (Image, Regions, 166, 255) 9 connection (Regions, ConnectedRegions) 10 select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 55908.3, 130688) 11 fill_up (SelectedRegions, RegionFillUp) 12 gen_contour_region_xld (RegionFillUp, Contours1, 'border') 13 fit_circle_contour_xld (Contours1, 'algebraic', -1, 0, 0, 3, 2, Row2, Column2, Radius1, StartPhi1, EndPhi1, PointOrder1) 14
15 *顯示信息 16 dev_display (Image) 17 dev_set_draw ('margin') 18 disp_circle (3600, Row2, Column2, Radius1) 19 RealDiameter:=Radius1*2/(100/X) 20 disp_message (3600, '實際直徑:'+RealDiameter+'mm', 'image', Row2, Column2, 'black', 'true') 21 stop()
實際測量了一下該圓齒輪的直徑大概在52mm左右,通過標定助手測量得到的結果為53.4278mm,有點誤差,因為標定時設置參考位姿是大致擺正標定板使得和像素坐標方向一致,實際上擺的不一定很正,所以會存在誤差。實際應用過程中,要拍標定圖像經過仿射變換到豎直方向,使得位姿參考即圖像坐標系和像素坐標系在x和y方向上是相互平行的,保存后加載該圖像進行標定並以它為位姿參考。或者用直尺拉一道豎直的線,將標定板靠着這條線放然后采集標定。