轉自:微信公眾號AI圖像
創建標定數據模型
你可以用算子create_calib_data創建一個標定數據模型,指定相機和標定物體的數量。當用一個相機的時候,你也用一個單獨的標定物體。
然后,你要做的是:
指定相機內部參數的初始值
描述標定物體
指定相機內參的初始值
你可以用算子set_calib_data_cam_param來設置相機內部參數。
除了標定數據模型,算子也需要下面的參數作為輸入:
CameraIdx:相機的索引(0代表單個相機)
CameraType: 相機的類型
CameraParam: 相機內參初始值的一個元組
那種畸變模型去使用
對于面陣相機,兩種畸變模型可供使用:劃分模型和多項式模型。劃分模型用一個參數來構造徑向畸變,多項式模型用5個參數來構造徑向和離心畸變。
劃分模型的優勢是畸變可以被快速的應用,尤其是對于反向畸變,例如如果世界坐標被映射到圖像平面。還有,如果只有幾張標定圖像被使用或者視野覆蓋不足,劃分模型則會比多項式模型得到更穩定的結果。多項式模型的主要優勢是它可以更精確的構造畸變,因為其用了更高階的項去構造徑向畸變,并且它也構造了離心畸變。需要注意的是,多項式模型不能夠反推。因此,反向畸變必須被迭代計算看,其要比劃分模型反向畸變的計算要慢。
一般的,劃分模型應該被用來標定。如果標定的精度不高,可以用多項式模型。但是需要注意的是,被用于多項式模型的標定序列必須提供一個完整的區域覆蓋,這個區域在后邊用于測量。畸變可能會在沒有被標定板覆蓋的區域外邊被不準確的構造出來。這種情況發生在圖像邊緣,也發生在標定板沒有覆蓋到的視野區域內部。
描述標定物體
用算子set_calib_data_calib_object,你可以指定標定物體所需的信息。
如果你用的是HALCON的標定板,對應的描述文件名字就足夠了。
如何獲得一個合適的標定板
確定給CCD相機的相機參數最簡單的方法就是利用HALCON的標定板(如圖1所示)。在這種情況下,找標定把的整個過程,提取標定標志點,以及決定提取標定標志點和各自3D世界坐標之間的對應關系都可以自動的被執行。更重要的是,標定板更加精確,1um或更小,對于高精度的應用其是前提條件。
兩種類型的HALCON標定板是被支持的。尤其是,六角形排列的標志點和矩形排列的標志點的標定板是可行的。具有六角形排列的標定板是在HALCON12中引進的,在大多數應用中被推薦使用,因為相比于矩形排列標志點的標定板,其提供了如下的優點:
l具有矩形排列標志點的標定板應該充滿圖像視野的四分之一。為了覆蓋包括不同傾斜的整個視野,許多圖像(至少10到20)是需要。因為六角形排列的標定板包含了眾多數目的標志點,因此用單個圖像就能夠覆蓋整個圖像面積,更少的圖像(6到7張)被需要去得到可比較的標定 結果。
l矩形排列標志點的標定板必須在圖像全部可見的,然而六角形排列的標定板可以伸出圖像的邊緣。進而,當放置標定板的時候,后者就不需要太多的在意。標定板圖像的獲取就變的更快和方便,而沒有穩定性的損失。
一個六邊形排列的標定板在單張圖像上應該充滿整個圖像區域。一個矩形排列的標定板應該至少覆蓋圖像區域的9分之一。為了提高標定的質量,我們推薦一個標定板至少覆蓋圖像區域的四分之一。
使用你自己的標定物體
利用HALCON,你不受限于使用一個平面標定板,例如HALCON標定板。你可以使用一個3D標定板或者甚至任意特征點(自然的標志)。僅有要求就是模型點的3D世界位置是已知的,并且具有很高的精度。
然后,你就簡單將標定物體的所有點(標志點)的3D坐標作為一個元組傳到算子set_calib_data_calib_object中的CalibObjeDescr。所有點的x, y, z坐標必須以【x, y, z】元組的順序進行打包。
然而,需要主要的是,如果你用自己的標定物,你就不能再用find_calib_object。相反,你必須自己來確定模型點的2D位置和對3D點的對應關系。
在多位姿上觀察標定物
標定的主要輸入數據是所謂的觀察。為此,標定物在不同的位姿被放置。對于每一個位姿,相機獲取一張圖像。在這張圖像上,標定物的標志點被提取,還有他們的(像素)坐標,連同相機的索引,標定物,標定物的位姿,包含響應標志點的索引,都被存儲在標定數據模型中。
如果你使用標準的HALCON標定板,你可以用算子find_calib_object去提取坐標,其將自動存儲獲得的信息到標定數據模型,包括標志點的坐標和標志點對應的列表。
如果你用的是自己的標定物,你必須提取其標志點和確定其對應關系,然后用set_calib_data_observ_points將信息存儲在標定數據模型中。
獲取標定圖像的規則
如果你想獲得準確的結果,請準照下面的規則:
用一個干凈的標定板
用多個圖像覆蓋整個視野,例如在視野所有區域至少放置標定一次
變換標定板的方向,包含標定板繞著x軸和y軸旋轉,這樣標定圖案的透視畸變是清晰可見的。沒有一些傾斜的標定板,焦距是不能夠被合理的計算出來(接近45度的傾斜角度是被推薦的)
對于六角形排列的標定板,至少使用6張圖像,矩形排列的標定板10到15張
對于矩形排列的標定板,用一個背景比標定板更暗的光照
標定把亮的部分的灰度值至少為100
標定板的亮暗對比應該超過100
用一個使標定板均勻的光照
圖像不能過曝(圖像亮的部分應該嚴格低于255)
圓的直徑應該至少20個像素
圓的直徑的像素至少20個像素
對于標定板大小的選取,六角形排列的標定板應該覆蓋整個圖像,對于矩形排列的標定板,至少覆蓋整個圖像的1/4
六角形排列的標定板,至少一個定位圖像在圖像中是完全可見的。如果至少兩個定位圖是可見的,可能去檢測是否標定板是反射的。對于矩形排列的標定把,標定應該在圖像中完全可見的。
圖像應該盡可能的包含一點噪聲
圖像應該被嚴格聚焦,例如在物體之間的過度應該被清晰的界定開。
需要注意的是,一個好的標定結果僅僅是在相機視野中標定標志點均勻分布的情況下才能獲得。你可以想象一下相對于視野的3D空間的一部分作為一個標定體積,如圖2所示,這里展示了,當從不同角度看時,標定板的兩個位姿和它們標定標志點的位置。可以看到,例如從面1看,更大的部分沒有被標志點所覆蓋。為了獲得更標志點的均勻分布,進而得到一個好的標定結果,你必須在你其他的圖像中放置標定板,進而對于整個視角,標定容積空的部分被最小化。注意的是,當有一個非常小的標定板(相比于視野而言),這就意味著比推薦的更多的標定圖像數量被需要使用。
如果一張圖像被用于標定過程或者如果標定板的方向在不同的標定圖像不發生變化,就不可能很好的確定焦距和相機的位姿;在這種情況下,僅僅聚焦之間的比率和標定板和相機之間的距離被確定下來。然而,在標定板平面進行世界坐標的測量是可能,但是不可能去讓相機參數去適應在另一個面上進行測量,例如標定板被放置的面。
圖1:標定容積的查看:(左)具有兩個標定位姿的標定容積和(右)當不同角度看時,標定標志點相對應的分布。對于一個好的標定結果,沒有標定標志點的區域(尤其從面1視角則更大)必須通過更多標定板位姿的謹慎選擇達到最小化。
結果世界坐標的精度,除了在圖像中的測量精度外,非常依賴被用來標定進程中所用的圖像的數量。越多圖像(具有更大不同的標定板位姿)被使用,更精確的結果將被獲取。
提取HALCON標定板上的標志點
算子find_calib_object尋找標定板,決定了標定標志點的圖像坐標,并具有很高的精度,最后將結果存儲在標定數據模型中。
需要注意的是find_caltab和find_marks_and_pose僅僅被用于矩形排列的標定板。還有,它們需要復雜的參數調整。相反的是,可以用于所有標準的HALCON標定板,自動選擇合適的參數,因此更容易去使用。
限制標定到特定的參數
如果某相機參數已知了,你可以用算子set_calib_data從標定中排除它們,類似的,你可以限制標定到某些參數。
執行標定
在準備了標定數據模型以后,可以通過調用calibrate_cameras來執行標定,用標定數據模型作為輸入:
作為一個直接結果是,僅僅是標定錯誤被返回。你可以用算子get_calib_data來更進一步的去分析標定結果的質量。
主要的標定結果,例如相機的內參,被存儲在標定數據模型中。
訪問標定結果
算子calibrate_cameras的主要結果由相機內參和每一張圖像標定板的位姿組成。算子將它們存儲在標定數據模型中,可以用算子get_calib_data來訪問它們。
相機外參并不能直接被獲取,因為所需的世界坐標系統的信息沒有存儲在標定數據模型中。然而,如果標定板被直接放置在測量平面上,其位姿可以被用來很容易的得到相機的外參,其是測量平面的位姿。
確定相機外參
相機外參描述了測量平面和相機的關系,例如如果僅僅外參是已知,就可能將相機坐標系統(CCS)轉化到測量平面的坐標系統,反之亦然。在HALCON中,測量平面被定義為世界坐標系統(WCS)z=0的平面。
相機外參可以用不同的方法來確定:
利用從某一個標定圖像獲取的位姿,其中標定圖像中標定板被直接放置在測量平面上。在這種情況下,你就可以用算子get_calib_data來獲得其位姿。
通過一個標定板被直接放置在測量平面的額外圖像,將相機內參的確定從相機外參的確定分離出來。應用find_calib_object去提取標定標志點和位姿。
自己去確定3D世界點和它們在圖像映射的對應關系,然后調用vector_to_pose。
如果你僅僅需要去精確地測量一個物體的尺寸,而不是在一個給定坐標系統的物體的絕對位置,前兩種方法中一種就可以使用。
后兩種情況具有相機外參的決定不依賴相機內參的優勢。如果用單個相機在數個平面上做測量,或者不能在原地標定相機,這將是更加靈活和有用。
下面將對不同的情況做詳細的講解。
在標定圖像之一將標定板放置在測量平面上
第一種情況是一種最容易決定外參的方法。標定板必須直接放置在測量平面上,例如流水線。
因為通過算子calibrate_cameras,標定板的位姿可以確定下來,你可以通過算子get_calib_data簡單的訪問其位姿。這樣,用一個單一的標定步驟,內參和外參就能確定下來。這里,在第一個標定圖像中標定板(標定物索引0)的位姿被確定。請注意的是每一個位姿是由7個值組成的。
如果標定把是無限的薄的,結果位姿將是測量平面的真實位姿。因為真實的標定板有一個厚度d>0,標定板的位姿通過一個垂直于測量平面的量d的移動,例如沿著WCS的z軸。為了矯正它,我們需要沿著WCS的z軸去移動位姿d個單位。為了執行這個移動,算子set_origin_pose被利用:
一般地,只要標定板和測量平面的空間關系是已知的,標定板在WCS中就可以任意地鎖定方向(如圖3所示)。然后,為了從標定板位姿中獲得測量平面的位姿,一個剛性轉換時必須的。在下面的例子中,標定板的位姿沿著y軸平移,接著繞著x軸旋轉。
在一個單獨圖像中放置標定板在測量平面上
如果用HALCON標定板的優勢可以將相機內參和外參分離所具有的靈活性相結合,第二種相機外參確定的方法可以使用。
首先,相機按照標定步驟進行標定。這可以優先于相機在最終使用點安裝之前完成。
然后,在最終使用點安裝完相機以后,外參就可以被確定。僅僅需要做的就是取一張圖,圖中標定被直接放在了測量平面上。從這張圖中,外參就可以被確定下來。這里,內參,標定板被直接放在測量平面上的圖像和標定標志點的世界坐標可從文件中讀取。
然后,標定標志點和標定板的位姿被提取:
最后,考慮到標定板的厚度,被給相機位姿原點的值平移標定板厚度個單位。
圖3 標定板和測量平面的關系
需要注意的是,如果你想將標定步驟分為兩個部分來完成的話,相機的聚焦是很重要的,因為改變焦點就相當于改變焦距,其是內參的一部分。
利用已知的3D點和它們對應的圖像點
如果在給定的世界坐標系統中執行測量是必要的,對于外參的確定,第三種情況就可以使用。這里,你需要知道至少不再一條直線上3個點的3D世界坐標,然后,你必須確定這些點映射后相對應的圖像坐標。現在,算子vector_to_pose可以被用來確定相機的外參。
下面的程序作為一個確定外參的例子。
首先,三個點的世界坐標被設定。
然后,在圖像上這些點映射后的圖像坐標被確定。在這個例子中,它們被很簡單的設定位一些接近的 值。實際上,它們應該以亞像素的精度確定下來,因為他們定義了相機外參。
最后,算子vector_to_pose在已知對應關系和相機內參的情況下,被調用。
從標定數據模型中刪除觀測圖
為了確定有關標定的觀測效果,或者從標定數據模型中移除壞質量的觀測數據,可以用算子remove_calib_data_observ刪除一個觀測圖。
當再次執行相機標定的時候,需要注意標定錯誤的改變。
保存結果和銷毀標定數據模型
在訪問結果(或者用算子write_cam_par和write_pose來存儲它們),你可以借助算子clear_calib_data銷毀標定數據模型。
原文標題:HALCON高級篇:3D相機標定
文章出處:【微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
3D
+關注
關注
9文章
2935瀏覽量
109012 -
相機
+關注
關注
4文章
1410瀏覽量
54337
原文標題:HALCON高級篇:3D相機標定
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
對于結構光測量、3D視覺的應用,使用100%offset的lightcrafter是否能用于點云生成的應用?
DLP_LightCrafter_4500_3D_Scan_Application軟件進行相機和投影儀標定時,進入相機拍照界面后程序未響應然后退出怎么解決?
肇觀電子首發自標定3D深度相機
技術指南丨深視智能3D相機上下對射測厚操作流程



奧比中光3D相機打造高質量、低成本的3D動作捕捉與3D動畫內容生成方案
OpenCV攜奧比中光3D相機亮相CVPR 2024

奧比中光正式發布全新Gemini 330系列雙目3D相機

奧比中光攜多款3D相機深度參與國內3D視覺最高規格會議

評論