提示:若沒有查找的算子,可以評論區留言,會盡快更新
Halcon應用:九點標定-手眼標定
- 前言
- 一、Halcon應用?
- 二、應用實戰
- 1、圖形理解[eye-to-hand]:
- 1.1、開始應用
- 2、 圖形理解[eye-in-hand]
- 2.1、 開始應用
前言
本篇博文主要用于記錄學習Halcon中算子的應用場景,及其使用代碼和圖像展示。只講通俗易懂使用方法,不講原理,不講原理,不講原理,重要的事情說三遍。
九點標定-手眼標定:想象一下,人眼睛看到一個東西的時候要讓手去抓取,就會控制手到物體旁邊,可是眼睛看到的位置和手的位置所處的不一樣,這就需要知道眼鏡和手的坐標關系。如果把大腦比作中間人,把眼睛比作A,把手比作C,如果A和中間人的關系知道,中間人和C的關系知道,那么C和A的關系就知道了,也就是手和眼的坐標關系也就清晰了。
提示:以下是本篇文章正文內容,下面案例可供參考,注意參數坐標的使用,能幫助你理解算子
一、Halcon應用?
Halcon 是一個強大的圖像處理工具,該工具是為了解決機器視覺項目任務而創建的。
二、應用實戰
1、圖形理解[eye-to-hand]:
眼在手外:站在相機角度看到的三角形物體,與站在機械臂角度看到的物體可能會有所差異,比如:
視角差異圖
大家看到這個腦海中是否會出現之前的一個應用:仿射變換,沒錯,就是用到仿射變換,將相機視角的圖變化到機械臂視角,經過平移和放縮,旋轉。
1.1、開始應用
我們可以采用九點標定板進行標定,在相機視角下,通過halcon將每一個點的圖像坐標獲取到,采用一一對應的方式,獲得對應機械臂坐標下的各個點的機械坐標,這樣就分別獲得兩組坐標,分別是相機視角下的坐標[Qx, Qy],一個是機械視角下的坐標[Rx, Ry]。
*假定已經獲得圖像坐標下的九點位置
column_img := [50,150,200,50,150,200,50,150,200]
row_img := [20,20,20,70,70,70,120,120,120]
*分別獲得機械坐標下的九個點位置
column_robot :=[275,225,170,280,230,180,295,240,190]
row_robot := [55,50,45,5,0,-5,-50,-50,-50]*利用該算子構建變換矩陣
vector_to_hom_mat2d (row_img, column_img, row_robot, column_robot, HomMat2D)
* 獲得需要知道的圖像坐標下的某點(Qx, Qy)的機械坐標(Rx, Ry)
affine_trans_point_2d (HomMat2D, Qx, Qy, Rx, Ry)
* 標定完成
2、 圖形理解[eye-in-hand]
眼在手中:相機固定在機械手上面,這種情況的標定過程實際上和相機和機械手分離的標定方法是一樣的,隨著機械臂帶著相機移動,相機視野中的三角形區域會發生變化,某些情況下相機只能看到三角形的一個角區域。但是機械視角和相機視角看到的會是一樣的。
2.1、 開始應用
同樣,我們還是采用標定板的方式進行標定,但是此相比前面會有點差異,如下:
思考一下:那么視野中只有一個標定點,如何進行標定呢🤔?
步驟1:將標志位(三角形)放置在相機視野中;
步驟2:記錄當前標志位的圖像坐標和機械臂的機械坐標
步驟3:移動機械臂帶動相機移動,比如位置2,大家可以參考背景上的雷電標志,雷電和三角形之間是相對固定的,也就是說,三角形標志在相機視野中在移動;
步驟4:那么我們可以使用9個位置,要保證三角形始終在相機視野中,分別記錄下對應位置的圖像坐標(三角形)和相應的機械坐標
至此,我們是不是得到了類似上面的九點標定數據形式
如果你當前是在做相機裝在機械臂末端的九點簡化標定,那你就是在用 Eye-in-Hand 模式,但做的是平面仿射標定,不涉及全6自由度位姿變換,屬于 簡化版手眼標定
* eye in hand
column_img := [869.0,979.07,1090.03,1461.64,1833.96,1724.21,1613.21,1240.49,1351.27]
row_img := [1372.36,1758.86,2145.75,2040.02,1935.01,1546.79,1158.53,1265.07,1652.6]
* column=x row=y
row_robot :=[98.84,109.81,120.62,121.88,123.11,112.23,101.62,100.343,111.08]
column_robot := [320.81,322.27,323.695,313.15,302.45,301.106,299.56,310.75,311.65]
* 現在我們根據圖像坐標求到機械坐標的變換矩陣
vector_to_hom_mat2d (row_img, column_img, row_robot, column_robot, HomMat2D1)
* 那從機械轉圖像一樣
vector_to_hom_mat2d (row_robot, column_robot, row_img, column_img, HomMat2D2)
* 問題來了
* 如果讓標志位移動到相機中心,機械手坐標是多少?
* 已知條件是:機械手拍照位置(Rx,Ry),和標志位坐標(row, column), 相機size=2448*2048
* 假定拍照位置是Ry=1300,Rx=1000, 在拍照位時圖像中標志位是row = 240,col = 542
* 求解坐標, 機械 -> 圖像 注意矩陣用的哪個
affine_trans_point_2d (HomMat2D2, Rx, Ry, col, row)
* 那么相機中心是
row_center := 1024
col_center := 1224
* 距離中心的偏移量
datarow := row_center - row
detacol := col_center - col
* 計算標志位在圖像中心時機械應該的坐標
affine_trans_point_2d (HomMat2D1, col_center, row_center, Qx1, Qy1)
注意:機械位置僅僅是相機看到的位置,實際并非在機械夾爪下方,需要計算相機和機械夾爪的相對位置,再次移動補償值,才是最終夾爪可以夾取的位置