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