您好, 歡迎來到化工儀器網(wǎng)! 登錄| 免費注冊| 產(chǎn)品展廳| 收藏商鋪|
13764705930
本文是發(fā)表在個人博客上的一篇文章現(xiàn)在轉(zhuǎn)載到此處,供大家一起交流,關(guān)于標定我總共寫了4篇文章,這是其中第3篇。
主要內(nèi)容就是對N點標定模塊一次內(nèi)部原理研究,對大家以后怎么用好這個模塊相信有點幫助。并用Halcon代碼模擬和驗證了其中原理
不一定正確,請大家指正
原文 :2D視覺定位引導系列 3 探討???VisionMaster N點標定的內(nèi)部原理
內(nèi)如如下:
前面 2篇文章,
2D視覺定位引導系列 1 圖解9點標定及仿真
2D視覺定位引導系列 2 圖解12點標定及仿真
對標定進行了初步探討,內(nèi)容涉及9點和12點標定。本篇文章來對??档腘點標定的內(nèi)部原理進行探討
關(guān)于N點標定的原理的說明太少,只有民間有些只言片語的說明。
叢 這篇文章V社區(qū)-機器智能技術(shù)交流-常規(guī)定位引導項目入門必看 才了解點N點標定得信息,文章作者在評論去說了這么一句話
“第五點拍照位也就是擬合旋轉(zhuǎn)中心的物理坐標,
12點標定得到的標定矩陣是做過旋轉(zhuǎn)歸一化的,旋轉(zhuǎn)中心經(jīng)過標定轉(zhuǎn)換即為(0,0)點,
所有點經(jīng)過標定轉(zhuǎn)換都是相對于旋轉(zhuǎn)中心的,此時加上這個拍照位坐標也就轉(zhuǎn)換到實際物理坐標系了"
就上面這句話,我相信10個人看了,9個人會迷糊,主要可能下面幾方面迷糊
1.第五點拍照位也就是擬合旋轉(zhuǎn)中心的物理坐標 第5點為什么是擬合旋轉(zhuǎn)中心的物理點
2.過旋轉(zhuǎn)歸一化 何為旋轉(zhuǎn)歸一化,為什么旋轉(zhuǎn)歸一化以后旋轉(zhuǎn)中心就是(0,0) 點
3.所有點經(jīng)過標定轉(zhuǎn)換都是相對于旋轉(zhuǎn)中心的,此時加上這個拍照位坐標也就轉(zhuǎn)換到實際物理坐標系了 物理坐標的獲取方式 大家是否理解
以上3點疑問后續(xù)為你慢慢說明白
N點標定 中的9點標定,N點標定模塊和我們平時做的9點標定 沒大的差別,提供9組像素和物理坐標就行了。
N點標定 中12 點標定與我這個系列文章12點標定 < 2D視覺定位引導系列 2 圖解12點標定及仿真>沒有太大的差別,如果能理解本人12點標定那篇文章內(nèi)容的同學
理解N點標定將易如反掌。2者的區(qū)別 就是這個旋轉(zhuǎn)歸一化。
認識下第5個點 第5點是標定的起始點,9點標定物理坐標就是在這個點的基礎(chǔ)上進行正負XY偏移得到的,旋轉(zhuǎn)標定也是在這個點完成的,旋轉(zhuǎn)標定時機構(gòu)XY停在這個點,只動角度部分。
到底何為旋轉(zhuǎn)歸一化。一句話總結(jié)就是將標定的起始點坐標設(shè)定為(0,0),也就是N點標定的第5個物理坐標,設(shè)定為(0,0),正常情況下這個坐標不會時(0,0),通過將坐標系的原點移動
到這個第5點就行了,具體操作如下。
假如原始物理坐標為(x1,y1)(x2,y2)..(x5,y5)…(x8,y8)(x9,y9)
則將坐標處理成 (x1-x5,y1-y5)(x2-x5,y2-y5)..(x5-x5,y5-y5)…(x8-x5,y8-y5)(x9-x5,y9-y5). (注意這種是假定相機靜止的情況,相機運動的案例,后面再討論)。
用處理后的物理坐標重新進行一次標定計算的新的標定系數(shù)。標定完成后 如何得到像素點的真實物理物理坐標。方法就是像素點經(jīng)過標定轉(zhuǎn)化后,還得加上標定時的第5點坐標(x5,y5),
因為當初標定的時候所有物理點可是都減去了這個(x5,y5),現(xiàn)在要得到真實的物理坐標就得把這個坐標加上。其實這解釋的上面問題的第3點。
上面是理論分析 下面開始標定驗證,將我12點標定的數(shù)據(jù)帶入到 ??礜點標定中計算
運行參數(shù)旋轉(zhuǎn) 上相機靜止
標定結(jié)果
關(guān)于N點標定標定結(jié)果說3點
1.像素精度為1,符合預期
2.旋轉(zhuǎn)軸圖像點,(-1000.487,999.5067)與我12點標定文章中計算的旋轉(zhuǎn)中心 (-1000.69,999.497)非常接近,差別是不同的圓擬合算法造成的。
3.關(guān)于標定結(jié)果中的旋轉(zhuǎn)中心物理點是(-1000.487,999.5067) 這個我暫時也沒法理解。
簡單驗證下
取2個點驗證下結(jié)果
1.將旋轉(zhuǎn)軸的圖像點對于的物理坐標應(yīng)該是(0,0),結(jié)果基本吻合
2.9點標定最后一個像素點(1499.5,1499.5),這個點在線新的坐標系下 為(2500,500)與 標定轉(zhuǎn)換的結(jié)果(2499.987,499.993) 非常接近。
Halcon 代碼來模擬這個標定流程
代碼還是采用我們上篇文章的halcon 代碼只是稍作改動,代碼的最后部分 也是對上面2個點進行驗證,結(jié)果??档慕Y(jié)果也基本也一致,
取物理坐標的地方,修改如下
*模擬九點獲取機械坐標,假設(shè)此時機械坐標就表示法蘭盤中心的坐標*tuple_concat(xwolrd,arm_center_row+move9Row[Index]*step,xwolrd)*tuple_concat(yworld,arm_center_col+move9Col[Index]*step,yworld)*???2點標定將標定的第5點設(shè)定為(0,0),以前是(3000,5000)tuple_concat(xwolrd,0+move9Row[Index]*step,xwolrd)tuple_concat(yworld,0+move9Col[Index]*step,yworld)
計算標定偏移的地方修改如下
*計算標定偏移*Dx:=arm_center_row-Qx*Dy:=arm_center_col-QyDx:=0-QxDy:=0-Qy
完整代碼如下,可復制 到halcon 直接運行
*窗口坐標 寬度dev_update_window('off')winw:=10000winh:=10000dev_open_window(0, 0, 1000, 1000, 'black', WindowHandle)dev_set_part(0,0,winw,winh)set_system ('clip_region', 'false')dev_clear_window()dev_set_draw ('margin')gen_region_line(xaxis, 0, 0, 0, winw)gen_region_line(yaxis, 0, 0, winw, 0)dev_set_color ('red')dev_display(xaxis)dev_display(yaxis)*定義相機視野長寬camstartrow:=5000camstartcol:=5000cam_width:=1000cam_degre:=0*定義相機左上角坐標,后面計算像素坐標用*以Cam的左上角為0,0 坐標 相機原點在機械坐標系中的位置是 (arm_center_row-cam_width),(camstartcol-cam_width)cam_origin_row:=camstartrow-cam_widthcam_origin_col:=camstartcol-cam_width*生成相機區(qū)域gen_rectangle2(camrect, camstartrow, camstartcol, cam_degre, cam_width, cam_width)dev_set_color ('blue')dev_set_draw ('margin')dev_display(camrect)*定義 Arm 法蘭盤位置,旋轉(zhuǎn)標定的物理中心arm_center_row:=3000arm_center_col:=5000gen_circle(arm_center, arm_center_row, arm_center_col, 200)*定義末端工具 可以理解為一更長桿一端連接在法蘭盤中心,一端帶著吸盤 ,初始將吸盤的中心也放到相機中心gen_region_line(tool,arm_center_row,arm_center_col,camstartrow,camstartcol)*定義吸盤gen_circle(tool_center, camstartrow, camstartcol, 100)concat_obj(arm_center,tool,ObjectsConcat)concat_obj(ObjectsConcat, tool_center, Tool_ARM)dev_set_color ('pink')dev_set_draw ('margin')dev_display(Tool_ARM)*定義2個軸的移動步長系數(shù)move9Row:=[ -1, 0, 1, 1, 0, -1, -1, 0, 1 ]move9Col:=[ -1, -1, -1, 0, 0, 0, 1, 1, 1 ]*機械坐標xwolrd:=[]yworld:=[]*像素坐標row_pixel:=[]col_pixel:=[]*每次移動補償step:=500.0for Index := 0 to 8 by 1*構(gòu)建每次平移矩陣hom_mat2d_identity(HomMat2DIdentity)hom_mat2d_translate(HomMat2DIdentity, move9Row[Index]*step, move9Col[Index]*step, HomMat2DTranslate)*模擬九點獲取機械坐標,假設(shè)此時機械坐標就表示法蘭盤中心的坐標*tuple_concat(xwolrd,arm_center_row+move9Row[Index]*step,xwolrd)*tuple_concat(yworld,arm_center_col+move9Col[Index]*step,yworld)*???2點標定將標定的第5點設(shè)定為(0,0),以前是(3000,5000)tuple_concat(xwolrd,0+move9Row[Index]*step,xwolrd)tuple_concat(yworld,0+move9Col[Index]*step,yworld)*模擬移動機械臂affine_trans_region(Tool_ARM, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor')*計算移動后機械臂的坐標,這里(Row[2],Column[2]),剛好是吸盤(小圓圈)的坐標area_center(RegionAffineTrans, Area, Row, Column)*模擬取吸盤的像素坐標tuple_concat(row_pixel,Row[2]-(cam_origin_row), row_pixel)tuple_concat(col_pixel,Column[2]-(cam_origin_col), col_pixel)dev_display(RegionAffineTrans)endfor*上面模擬九點標定以后計算標定數(shù)據(jù),HomMat2D 就是9點標定的轉(zhuǎn)移矩陣vector_to_hom_mat2d(row_pixel, col_pixel, xwolrd, yworld, HomMat2D)*3點旋轉(zhuǎn) 標定起點 旋轉(zhuǎn)3此rotate3Point:=[20,0,-20]arc_row:=[]arc_col:=[]for Index1 := 0 to 2 by 1hom_mat2d_identity(HomMat2DIdentity)*標定起點 選擇hom_mat2d_rotate(HomMat2DIdentity, rad(rotate3Point[Index1]), arm_center_row, arm_center_col, HomMat2DRotate)*模擬移動機械臂affine_trans_region(Tool_ARM, RegionAffineTrans, HomMat2DRotate, 'nearest_neighbor')*計算移動后機械臂的坐標,這里(Row[2],Column[2]),剛好是吸盤(小圓圈)的坐標,area_center(RegionAffineTrans, Area, Row, Column)*模擬取吸盤的像素坐標tuple_concat(arc_row, Row[2]-(cam_origin_row), arc_row)tuple_concat(arc_col,Column[2]-(cam_origin_col), arc_col)dev_set_color ('turquoise')dev_display(RegionAffineTrans)endfor*通過上面的3點 計算圓心gen_contour_polygon_xld(Contour, arc_row, arc_col)get_part(WindowHandle, Row11, Column11, Row2, Column2)fit_circle_contour_xld(Contour, 'algebraic', -1, 0, 0, 3, 2, Row1, Column1, Radius, StartPhi, EndPhi, PointOrder)*Row1,Column1 就是圓心的像素坐標,當前值(-1000,1000),gen_cross_contour_xld(Cross, Row1,Column1, 100, 0)set_system ('clip_region', 'false')dev_set_color ('red')dev_display(Cross)affine_trans_point_2d(HomMat2D, Row1, Column1, Qx, Qy)dev_set_color ('blue')gen_cross_contour_xld(Cross1, Qx,Qy, 200, 0)*顯示旋轉(zhuǎn)標定中心坐標dev_display(Cross1)*計算偏移*Dx:=arm_center_row-Qx*Dy:=arm_center_col-Qy*現(xiàn)在物理旋轉(zhuǎn)中心被設(shè)定為(0,0),所以計算偏移不用(arm_center_row,arm_center_col)這個數(shù)據(jù)了,希望能理解Dx:=0-QxDy:=0-Qy*修正9點標定的機械坐標xwolrd1:=xwolrd+Dxywolrd1:=yworld+Dy*重新計算標定矩陣vector_to_hom_mat2d(row_pixel, col_pixel, xwolrd1, ywolrd1, HomMat2D1)*重新驗算標定的旋轉(zhuǎn)中心是否與法蘭中心重合*旋轉(zhuǎn)中心驗證affine_trans_point_2d(HomMat2D1, Row1, Column1, Qx1, Qy1)*(1499.5,1499.5 )affine_trans_point_2d(HomMat2D1, 1499.5,1499.5 , Qx2, Qy2)
總結(jié):
本文通過分析了,??礜點標定的內(nèi)部原理,帶大家了解了何為旋轉(zhuǎn)歸一化。 ??礜點標定模塊采用12點標定,
1.如果相機靜止,需要記住第五代物理坐標,以后計算像素的物理坐標要把第五點坐標值加上。怎么感覺這類似于相對標定。
2.如果相機運動(后續(xù)文章會講),就有個拍照位置的問題,最終的物理坐標是像素經(jīng)過標定轉(zhuǎn)換后加上拍照位置的物理坐標得到最終物理坐標
請輸入賬號
請輸入密碼
請輸驗證碼
以上信息由企業(yè)自行提供,信息內(nèi)容的真實性、準確性和合法性由相關(guān)企業(yè)負責,化工儀器網(wǎng)對此不承擔任何保證責任。
溫馨提示:為規(guī)避購買風險,建議您在購買產(chǎn)品前務(wù)必確認供應(yīng)商資質(zhì)及產(chǎn)品質(zhì)量。