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 ()
 
1、讀入圖像,函數以下
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。
2、提取圖像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(如標定板的外框)的,這些輪廓線將被忽略拋棄。
 
3、保存座標值
 
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中的存儲順序是一致的。
 
4、攝像機標定輸入參數
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)。
  
5、肯定攝像機的內參,偏差分析,算子以下
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 函數就是實現這個功能。
 
6、選擇某幅圖像做爲參考位姿,肯定攝像機外參
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   :計算攝像機外部參數。
相關文章
相關標籤/搜索