天天看點

Halcon标定系列(5):4點标定之眼在手外項目實踐,已知仿射變換矩陣,計算得到旋轉角度和縮放因子等參數

本人最近做視覺定位項目,眼在手外,使用了halcon4點标定(其實3點就行了,因為3個不共線的點可以确定一個平面。另外,如果4點标定結果精度夠的話,完全不必要9點标定),這裡分享一下:

Halcon标定系列(5):4點标定之眼在手外項目實踐,已知仿射變換矩陣,計算得到旋轉角度和縮放因子等參數

一、首先說一下為什麼要标定以及标定的作用是什麼:

1、什麼情況需要相機标定?

除非單相機的視角(FOV)小于20mm,或者系統精度要求幾個mm,否則都要做。

很多初學者,都對标定概念模糊不清,分不清坐标系之間的關系,搞不清相機标定和機械手相機标定有什麼關系,本文給大家解釋。

我們通常所說的相機标定分為兩種,一種是相機參數的标定,這一般用到張氏标定法,标定的作用是校正相機自身的畸變,利用校正得到的參數對圖形進行處理後再呈現出來。關于這方面的資料,網上大把,我也不再此說明。一般的機械手定位也不會進行這個标定,因為現在的相機畸變還是很小的,精度可以滿足大多數要求。

本文要介紹的是第二種,相機和機械手之間的标定,作用:建立相機坐标系和機械手坐标系之間的關系,即給機械手裝上眼睛,讓它去哪就去哪。

常用的标定方法是9點标定。采用9點标定是因為點數越多越精确,但也不是越多越好,因為點數越多标定也會越麻煩,所選取的9個點在相機中間不要太靠近邊緣,能夠照顧到要定位的點即可。

2、本質就是仿射變換,一個坐标系轉換到另一個坐标系;

3、最少三個不同線的點,理論上點越多越好,例如九點标定就有一定的拟合作用,能夠減少部分誤差,例如由于機械安裝或者相機旋轉傾斜帶來的誤差;精度可做到0.05mm;

二、再來看看我的4點标定,重點就是vector_to_hom_mat2d算子:

*初始化矩陣
pxX := gen_tuple_const(4, 0)
pxY := gen_tuple_const(4, 0)
mmX := gen_tuple_const(4, 0)
mmY := gen_tuple_const(4, 0)
*像素坐标
pxX:=[2609, 2529, 677, 568]
pxY:=[368, 2262, 2102, 385]
*機械坐标
mmX:=[74.53, 76.53, 131.07, 134.556]
mmY:=[68.498, 124.3, 119.69, 69.116]
*[不推薦]根據兩個以上點對計算相似仿射變換矩陣,支援旋轉、平移和縮放
vector_to_similarity (pxX, pxY, mmX, mmY, HomMat2D_Not)
*[推薦]根據三個以上點對計算仿射變換矩陣,支援旋轉、平移、縮放、斜切
*Approximate an affine transformation from point correspondences.
vector_to_hom_mat2d (pxX, pxY, mmX, mmY, HomMat2D)
*已知仿射變換矩陣,倒推計算仿射變換參數
*根據仿射變換矩陣(齊次二維變換矩陣)計算仿射變換參數
*Compute the affine transformation parameters from a homogeneous 2D transformation matrix.
*HomMat2D   (輸入參數):仿射變換矩陣
*Sx         (輸出參數):x方向的縮放因子(如果從圖像空間變換到實體空間,就是x方向的像素單量)
*Sy         (輸出參數):y方向的縮放因子(如果從圖像空間變換到實體空間,就是y方向的像素單量)
*Phi        (輸出參數):旋轉角度
*Theta      (輸出參數):斜切角度
*Tx         (輸出參數):沿x方向平移的距離
*Ty         (輸出參數):沿y方向平移的距離
hom_mat2d_to_affine_par (HomMat2D, Sx, Sy, Phi, Theta, Tx, Ty)
*弧度轉換角度
tuple_deg (Phi, DegPhi)
tuple_deg (Theta, DegTheta)
*儲存矩陣
write_tuple (HomMat2D, 'd:\\1.tup')
*讀取矩陣
read_tuple ('d:\\1.tup', HomMat2D)
*利用像素坐标計算出機械坐标
Row := [0, 3664, 3664, 0, 3664/2]
Column := [0, 2748, 0, 2748, 2748/2]
affine_trans_point_2d (HomMat2D, Row, Column, Qx, Qy)
stop()      

其中的算子hom_mat2d_to_affine_par就是通過仿射變換矩陣,倒推計算得出若幹參數。

三、遇到的問題:加工過程,相機需要移動怎麼辦?

http://www.ihalcon.com/read-16036.html

具體場景如下:

1、相機安裝在機械手上方,安裝在導軌上,但相機不是固定不動的,它可以沿着X方向移動,工作時需要移動到A,B,C三個點分别拍攝。

2、機械手在相機下方,可以X和Y方向移動。

3、理論上相機的X導軌和機械手X軸是平行關系,但是實際安裝時,機械難免有誤差。

我現在把相機停靠在A點,拍照,然後使用4點标定得到了仿射變換矩陣M1。

問題是:相機停靠在B點和C點時,是否還需要分别進行4點标定??還是說有更簡便的方法,直接使用A點得到的矩陣M1?那在B點和C點怎麼使用這個M1呢?

答:在B點位置拍照,先用老矩陣M1算出(x,y),然後得出實際機械坐标值為(x+B-A,y)。說明白了就是平移而已。

---

眼在手外的參考文獻

http://www.ihalcon.com/read-13820-1.html

繼續閱讀