Halcon相機標定


攝像機標定程序:
注意:E:/calibration_image :為標定圖像文件路徑
      'E:/calibration_description/caltab_123mm.descr:為標定描述文件路徑
 
*作者:騎螞蟻上高速
*程序開始
list_files ('E:/calibration_image', 'files', ImageFiles)
TmpCtrl_AllMarkRows := []
TmpCtrl_AllMarkColumns := []
TmpCtrl_StartPoses := []
TmpCtrl_ReferenceIndex := 0
StartParameters := [0.008,0,5.2e-006,5.2e-006,640,512,1280,1024]
for Index := 0 to |ImageFiles|-1 by 1
    read_image (Image, ImageFiles[Index])
    find_caltab (Image, TmpObj_PlateRegion, 'E:/calibration_description/caltab_123mm.descr', 3, 112, 5)
    find_marks_and_pose (Image, TmpObj_PlateRegion, 'E:/calibration_description/caltab_123mm.descr', StartParameters, 128, 10, 18, 0.9, 15, 100, TmpCtrl_MarkRows, TmpCtrl_MarkColumns, TmpCtrl_EstimatedPose)
    TmpCtrl_AllMarkRows := [TmpCtrl_AllMarkRows, TmpCtrl_MarkRows]
    TmpCtrl_AllMarkColumns := [TmpCtrl_AllMarkColumns, TmpCtrl_MarkColumns]
    TmpCtrl_StartPoses := [TmpCtrl_StartPoses, TmpCtrl_EstimatedPose]
endfor
caltab_points ('E:/calibration_description/caltab_123mm.descr', TmpCtrl_X, TmpCtrl_Y, TmpCtrl_Z)
camera_calibration (TmpCtrl_X, TmpCtrl_Y, TmpCtrl_Z, TmpCtrl_AllMarkRows, TmpCtrl_AllMarkColumns, StartParameters, TmpCtrl_StartPoses, 'all', CameraParameters, TmpCtrl_FinalPoses, TmpCtrl_Errors)
tuple_select_range (TmpCtrl_FinalPoses, 7*TmpCtrl_ReferenceIndex, 7*TmpCtrl_ReferenceIndex + 6, CameraPose)
set_origin_pose (CameraPose, 0.0, 0.0, 0.001, CameraPose)
stop ()
 
一、讀入圖像,函數如下
list_files ('E:/calibration_image', 'files', ImageFiles)
for Index := 0 to |ImageFiles|-1 by 1
    read_image(Image, ImageFiles[Index])
endfor
注釋: 'E:/calibration_image':為圖像路徑,圖像文件索引是從0開始的,所以 |ImageFiles|(文件數量)減去1。
算子:read_image(:Image :FileName):讀取名稱為FileName的圖像Image。
二、提取圖像Images中標定板上的圓形標志來確定標定板的有效區域,算子如下:
find_caltab(Image:Caltab:CalTabDescrFile,SizeGauss,MarkThresh,MinDiamMarks:)
    
確定標定板上圓形標志點的二維坐標,並得到攝像機外部參數的初始值,算子如下:
find_marks_and_pose (Image,CalTabRegion: :CalTabDescrFile ,StartCamParam ,StartThresh,                           DeltaThresh,MinThresh,Alpha,MinContLength,MaxDiamMarks:Rcoord,Ccoord,                       StartPose)
   
注釋函數find_caltab在圖像中尋找標定板是基於標定板的特征——在一個亮的區域中存在黑色標定點。首先使用高斯濾波器進行圖像平滑。參數SizeGauss確定高斯濾波器的尺寸。SizeGauss值越大進行圖像平滑的幅度就越大,這在圖像噪聲比較大時是必要的。在進行圖像平滑操作后,為了尋找標定板的位置,我們進行一個閾值分割,可以參考灰度直方圖,灰度值范圍由最小值MarkThresh到最大值255,因此,MarkThresh必須小於標定板上白色區域的灰度值,並且最好大於圖像中其他大范圍較亮的區域的灰度值。在閾值分割得到的多個區域中,其中包含孔的數量最符合標定板上標定點數量的凸狀區域被選中。為了減少噪聲影響,直徑小於MinDiamMarks的孔將被除去。標志點的數量可以從標定板描述文件(CalTabDescrFile)中讀出。
    函數find_marks_and_pose提取標定板上各個標志點,並精確得到它們在圖像坐標系中的坐標。上面我們已經通過函數find_caltab找到了標定板的區域,這時我們首先在輸入圖像Image的這個區域(CalTabRegion)中應用邊緣檢測。這個邊緣檢測通過參數Alpha進行控制。Alpha的值越大 ,邊緣檢測的靈敏度也就越高,這將使邊緣檢測時找到更多的細節,但同時對噪聲的抑制能力下降。在邊緣圖像中,提取出封閉的輪廓線。為了更准確的尋找輪廓線,對邊緣的振幅進行一個閥值操作。所有振幅高的點(標定點的邊界)都被選中。首先,這個閥值設置為StartTh
resh。如果尋找封閉輪廓線或估計位姿失敗,這個閥值接連地減DeltaThresh 直到閥值降低到最小值MinThresh。
    閉合的輪廓線的數量必須與標定板描述文件(CalTabDescrFile)中描述的標志點的數量一致,並且這些閉合輪廓線的形狀必須是橢圓狀的。長度比MinContLength 短的輪廓線或者輪廓線形成區域的直徑大MaxDiamMarks(如標定板的外框)的,這些輪廓線將被忽略拋棄。
 
三、保存坐標值
 
TmpCtrl_AllMarkRows := []
TmpCtrl_AllMarkColumns := []
TmpCtrl_StartPoses := []
 
TmpCtrl_AllMarkRows := [TmpCtrl_AllMarkRows, TmpCtrl_MarkRows]
TmpCtrl_AllMarkColumns := [TmpCtrl_AllMarkColumns, TmpCtrl_MarkColumns]
TmpCtrl_StartPoses := [TmpCtrl_StartPoses, TmpCtrl_EstimatedPose]
 
注釋:標定點的在圖像坐標系中的坐標存儲  
在兩個數組中,第一個數組存儲所有點的行
   
坐標,第二個數組存儲所有點的列坐標,並
   
且要保證兩個數組的值一一對應。這些數組
   
的長度取決於標定板上標定點的個數以及
   
拍攝的標定圖像的數量。它們的存儲順序是  
按照圖像順序排列的,也就是說剛開始的m
  
 
個值存儲的是第一幅圖像中m個標定點的
   
坐標值,這個順序和函數caltab_points返回
   
的數組X,Y,Z中的存儲順序是一致的。
 
四、攝像機標定輸入參數
StartParameters := [0.008,0,5.2e-006,5.2e-006,640,512,1280,1024]
    初始值攝像機標定是一個非常復雜的非線性優化的問題,因此就需要為攝像機的參數提供盡量精確的初始值。攝像機內部參數的初始值主要由CCD傳感器和鏡頭的說明書確定。面陣攝像機的內參初始值可以輸入一個
數 組 [f,k,Sx,Sy,Cx,Cy,NumColumns,NumRows]也就是說 ,不僅要提供攝像機的初始內參,還要提供圖像的寬(NumColumns)和高(NumRows)。
  
五、確定攝像機的內參,誤差分析,算子如下
camera_calibration(: :NX,NY,NZ,Nrow,Ncol,StartCamParam,                                                       NstartPose,EstimateParams:CamParam,NfinalPose,Errors)
函數如下:
caltab_points ('E:/calibration_description/caltab_123mm.descr', TmpCtrl_X, TmpCtrl_Y, TmpCtrl_Z)
camera_calibration (TmpCtrl_X, TmpCtrl_Y, TmpCtrl_Z, TmpCtrl_AllMarkRows, TmpCtrl_AllMarkColumns,                     StartParameters, TmpCtrl_StartPoses, 'all', CameraParameters,                                    TmpCtrl_FinalPoses, TmpCtrl_Errors)
    
    在給定了攝像機的內外參數的初始值之后,已知三維位置的標定點可以轉換到攝像機坐標系中。然后,尋求一組攝像機的參數可以使通過計算投影到圖像上的標定點坐標和直接從圖像中提取出的標定點的坐標的距離最小。這個最小化的過程將返回相當精確的攝像機參數。然而,為了獲得最高精度的攝像機參數,需要拍攝標定板的多幅圖像,在拍攝時,標定板被放置在圖像的不同位置並且旋轉的角度也不同,以致於使用外部方位的所有自由度。如果拍攝一幅包含標定板的圖像,最優化的參數包括攝像機的內參和一組外參。此時,最優化的目標是確定所有這些參數能夠滿足每幅圖中通過投影計算得到的點坐標和圖像中直接提取的坐標值距離最小。在HALCON中 ,使用 camera_calibration 函數就是實現這個功能。
 
六、選擇某幅圖像作為參考位姿,確定攝像機外參
TmpCtrl_ReferenceIndex := 0
注釋:TmpCtrl_ReferenceIndex:為將要設置為參考位姿勢的圖像。0代表第一張。1代表第二張。以此類推。
tuple_select_range (TmpCtrl_FinalPoses, 7*TmpCtrl_ReferenceIndex, 7*TmpCtrl_ReferenceIndex + 6, CameraPose)
set_origin_pose (CameraPose, 0.0, 0.0, 0.001, CameraPose)
注釋:tuple_select_range:進行數組選擇。
      set_origin_pose   :計算攝像機外部參數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM