
更新時間:2026-02-05
瀏覽次數(shù):196本文是發(fā)表在個人博客上的一篇文章現(xiàn)在轉(zhuǎn)載到此處,供大家一起交流,關(guān)于標(biāo)定我總共寫了4篇文章,這是其中第3篇。
主要內(nèi)容就是對N點標(biāo)定模塊一次內(nèi)部原理研究,對大家以后怎么用好這個模塊相信有點幫助。并用Halcon代碼模擬和驗證了其中原理
不一定正確,請大家指正
原文 :2D視覺定位引導(dǎo)系列 3 探討海康 VisionMaster N點標(biāo)定的內(nèi)部原理
內(nèi)如如下:
前面 2篇文章,
2D視覺定位引導(dǎo)系列 1 圖解9點標(biāo)定及仿真
2D視覺定位引導(dǎo)系列 2 圖解12點標(biāo)定及仿真
對標(biāo)定進(jìn)行了初步探討,內(nèi)容涉及9點和12點標(biāo)定。本篇文章來對??档腘點標(biāo)定的內(nèi)部原理進(jìn)行探討
關(guān)于N點標(biāo)定的原理的說明太少,只有民間有些只言片語的說明。
叢 這篇文章V社區(qū)-機器智能技術(shù)交流-常規(guī)定位引導(dǎo)項目入門必看 才了解點N點標(biāo)定得信息,文章作者在評論去說了這么一句話
“第五點拍照位也就是擬合旋轉(zhuǎn)中心的物理坐標(biāo),
12點標(biāo)定得到的標(biāo)定矩陣是做過旋轉(zhuǎn)歸一化的,旋轉(zhuǎn)中心經(jīng)過標(biāo)定轉(zhuǎn)換即為(0,0)點,
所有點經(jīng)過標(biāo)定轉(zhuǎn)換都是相對于旋轉(zhuǎn)中心的,此時加上這個拍照位坐標(biāo)也就轉(zhuǎn)換到實際物理坐標(biāo)系了"
就上面這句話,我相信10個人看了,9個人會迷糊,主要可能下面幾方面迷糊
1.第五點拍照位也就是擬合旋轉(zhuǎn)中心的物理坐標(biāo) 第5點為什么是擬合旋轉(zhuǎn)中心的物理點
2.過旋轉(zhuǎn)歸一化 何為旋轉(zhuǎn)歸一化,為什么旋轉(zhuǎn)歸一化以后旋轉(zhuǎn)中心就是(0,0) 點
3.所有點經(jīng)過標(biāo)定轉(zhuǎn)換都是相對于旋轉(zhuǎn)中心的,此時加上這個拍照位坐標(biāo)也就轉(zhuǎn)換到實際物理坐標(biāo)系了 物理坐標(biāo)的獲取方式 大家是否理解
以上3點疑問后續(xù)為你慢慢說明白
N點標(biāo)定 中的9點標(biāo)定,N點標(biāo)定模塊和我們平時做的9點標(biāo)定 沒大的差別,提供9組像素和物理坐標(biāo)就行了。
N點標(biāo)定 中12 點標(biāo)定與我這個系列文章12點標(biāo)定 < 2D視覺定位引導(dǎo)系列 2 圖解12點標(biāo)定及仿真>沒有太大的差別,如果能理解本人12點標(biāo)定那篇文章內(nèi)容的同學(xué)
理解N點標(biāo)定將易如反掌。2者的區(qū)別 就是這個旋轉(zhuǎn)歸一化。
認(rèn)識下第5個點 第5點是標(biāo)定的起始點,9點標(biāo)定物理坐標(biāo)就是在這個點的基礎(chǔ)上進(jìn)行正負(fù)XY偏移得到的,旋轉(zhuǎn)標(biāo)定也是在這個點完成的,旋轉(zhuǎn)標(biāo)定時機構(gòu)XY停在這個點,只動角度部分。
到底何為旋轉(zhuǎn)歸一化。一句話總結(jié)就是將標(biāo)定的起始點坐標(biāo)設(shè)定為(0,0),也就是N點標(biāo)定的第5個物理坐標(biāo),設(shè)定為(0,0),正常情況下這個坐標(biāo)不會時(0,0),通過將坐標(biāo)系的原點移動
到這個第5點就行了,具體操作如下。
假如原始物理坐標(biāo)為(x1,y1)(x2,y2)..(x5,y5)…(x8,y8)(x9,y9)
則將坐標(biāo)處理成 (x1-x5,y1-y5)(x2-x5,y2-y5)..(x5-x5,y5-y5)…(x8-x5,y8-y5)(x9-x5,y9-y5). (注意這種是假定相機靜止的情況,相機運動的案例,后面再討論)。
用處理后的物理坐標(biāo)重新進(jìn)行一次標(biāo)定計算的新的標(biāo)定系數(shù)。標(biāo)定完成后 如何得到像素點的真實物理物理坐標(biāo)。方法就是像素點經(jīng)過標(biāo)定轉(zhuǎn)化后,還得加上標(biāo)定時的第5點坐標(biāo)(x5,y5),
因為當(dāng)初標(biāo)定的時候所有物理點可是都減去了這個(x5,y5),現(xiàn)在要得到真實的物理坐標(biāo)就得把這個坐標(biāo)加上。其實這解釋的上面問題的第3點。
上面是理論分析 下面開始標(biāo)定驗證,將我12點標(biāo)定的數(shù)據(jù)帶入到 海康N點標(biāo)定中計算
運行參數(shù)旋轉(zhuǎn) 上相機靜止
標(biāo)定結(jié)果
關(guān)于N點標(biāo)定標(biāo)定結(jié)果說3點
1.像素精度為1,符合預(yù)期
2.旋轉(zhuǎn)軸圖像點,(-1000.487,999.5067)與我12點標(biāo)定文章中計算的旋轉(zhuǎn)中心 (-1000.69,999.497)非常接近,差別是不同的圓擬合算法造成的。
3.關(guān)于標(biāo)定結(jié)果中的旋轉(zhuǎn)中心物理點是(-1000.487,999.5067) 這個我暫時也沒法理解。
簡單驗證下
取2個點驗證下結(jié)果
1.將旋轉(zhuǎn)軸的圖像點對于的物理坐標(biāo)應(yīng)該是(0,0),結(jié)果基本吻合
2.9點標(biāo)定最后一個像素點(1499.5,1499.5),這個點在線新的坐標(biāo)系下 為(2500,500)與 標(biāo)定轉(zhuǎn)換的結(jié)果(2499.987,499.993) 非常接近。
Halcon 代碼來模擬這個標(biāo)定流程
代碼還是采用我們上篇文章的halcon 代碼只是稍作改動,代碼的最后部分 也是對上面2個點進(jìn)行驗證,結(jié)果??档慕Y(jié)果也基本也一致,
取物理坐標(biāo)的地方,修改如下
*模擬九點獲取機械坐標(biāo),假設(shè)此時機械坐標(biāo)就表示法蘭盤中心的坐標(biāo)*tuple_concat(xwolrd,arm_center_row+move9Row[Index]*step,xwolrd)*tuple_concat(yworld,arm_center_col+move9Col[Index]*step,yworld)*???2點標(biāo)定將標(biāo)定的第5點設(shè)定為(0,0),以前是(3000,5000)tuple_concat(xwolrd,0+move9Row[Index]*step,xwolrd)tuple_concat(yworld,0+move9Col[Index]*step,yworld)
計算標(biāo)定偏移的地方修改如下
*計算標(biāo)定偏移*Dx:=arm_center_row-Qx*Dy:=arm_center_col-QyDx:=0-QxDy:=0-Qy
完整代碼如下,可復(fù)制 到halcon 直接運行
*窗口坐標(biāo) 寬度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*定義相機左上角坐標(biāo),后面計算像素坐標(biāo)用*以Cam的左上角為0,0 坐標(biāo) 相機原點在機械坐標(biāo)系中的位置是 (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)標(biāo)定的物理中心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 ]*機械坐標(biāo)xwolrd:=[]yworld:=[]*像素坐標(biāo)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)*模擬九點獲取機械坐標(biāo),假設(shè)此時機械坐標(biāo)就表示法蘭盤中心的坐標(biāo)*tuple_concat(xwolrd,arm_center_row+move9Row[Index]*step,xwolrd)*tuple_concat(yworld,arm_center_col+move9Col[Index]*step,yworld)*海康12點標(biāo)定將標(biāo)定的第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')*計算移動后機械臂的坐標(biāo),這里(Row[2],Column[2]),剛好是吸盤(小圓圈)的坐標(biāo)area_center(RegionAffineTrans, Area, Row, Column)*模擬取吸盤的像素坐標(biāo)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*上面模擬九點標(biāo)定以后計算標(biāo)定數(shù)據(jù),HomMat2D 就是9點標(biāo)定的轉(zhuǎn)移矩陣vector_to_hom_mat2d(row_pixel, col_pixel, xwolrd, yworld, HomMat2D)*3點旋轉(zhuǎn) 標(biāo)定起點 旋轉(zhuǎn)3此rotate3Point:=[20,0,-20]arc_row:=[]arc_col:=[]for Index1 := 0 to 2 by 1hom_mat2d_identity(HomMat2DIdentity)*標(biāo)定起點 選擇hom_mat2d_rotate(HomMat2DIdentity, rad(rotate3Point[Index1]), arm_center_row, arm_center_col, HomMat2DRotate)*模擬移動機械臂affine_trans_region(Tool_ARM, RegionAffineTrans, HomMat2DRotate, 'nearest_neighbor')*計算移動后機械臂的坐標(biāo),這里(Row[2],Column[2]),剛好是吸盤(小圓圈)的坐標(biāo),area_center(RegionAffineTrans, Area, Row, Column)*模擬取吸盤的像素坐標(biāo)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 就是圓心的像素坐標(biāo),當(dāng)前值(-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)標(biāo)定中心坐標(biāo)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點標(biāo)定的機械坐標(biāo)xwolrd1:=xwolrd+Dxywolrd1:=yworld+Dy*重新計算標(biāo)定矩陣vector_to_hom_mat2d(row_pixel, col_pixel, xwolrd1, ywolrd1, HomMat2D1)*重新驗算標(biāo)定的旋轉(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é):
本文通過分析了,??礜點標(biāo)定的內(nèi)部原理,帶大家了解了何為旋轉(zhuǎn)歸一化。 ??礜點標(biāo)定模塊采用12點標(biāo)定,
1.如果相機靜止,需要記住第五代物理坐標(biāo),以后計算像素的物理坐標(biāo)要把第五點坐標(biāo)值加上。怎么感覺這類似于相對標(biāo)定。
2.如果相機運動(后續(xù)文章會講),就有個拍照位置的問題,最終的物理坐標(biāo)是像素經(jīng)過標(biāo)定轉(zhuǎn)換后加上拍照位置的物理坐標(biāo)得到最終物理坐標(biāo)
021-51693791
xc021@vip.qq.com
86-021-51693792
版權(quán)所有© 2026 ??抵腔郏ㄉ虾#C器人有限公司 All Rights Reserved 備案號:滬ICP備2025156165號-1
技術(shù)支持:化工儀器網(wǎng) 管理登錄 sitemap.xml