Halcon: 畸变矫正与标定(1)
1、?Halcon相機(jī)標(biāo)定和圖像矯正
??? 對于相機(jī)采集的圖片,會由于相機(jī)本身和透鏡的影響產(chǎn)生形變,通常需要對相機(jī)進(jìn)行標(biāo)定,獲取相機(jī)的內(nèi)參或內(nèi)外參,然后矯正其畸變。相機(jī)畸變主要分為徑向畸變和切向畸變,其中徑向畸變是由透鏡造成的,切向畸變是由成像儀與相機(jī)透鏡的不平行造成的。
??? 針孔模型是理想透鏡的成像模型,但是實際中相機(jī)的透鏡不可能是理想的模型,透鏡形狀的非理想特征造成像點會沿徑向發(fā)生畸變。一個像點沿徑向內(nèi)縮叫負(fù)畸變,或桶形畸變沿徑向外延叫正畸變,或枕形畸變。這種崎變相對于光軸嚴(yán)格對稱的,也是畸變的主要分量。
相機(jī)標(biāo)定模型公式,
其中,(X,Y,Z)為世界坐標(biāo)系中的實際點坐標(biāo),(u,v)為圖像坐標(biāo)系統(tǒng)的像素坐標(biāo),A為相機(jī)內(nèi)參,f像素單元的焦距,c圖像像素中心點。
1.1 halcon相機(jī)標(biāo)定
1.1.1標(biāo)定助手及相機(jī)參數(shù)設(shè)置
打開halcon標(biāo)定助手,加載標(biāo)定板文件,選擇相機(jī)類型,設(shè)置相機(jī)參數(shù),然后加載相機(jī)采集的標(biāo)定圖像,如下圖所示,圖像中全部標(biāo)定點能夠檢測出,即采集的相機(jī)已經(jīng)設(shè)置好,然后生成代碼。
圖4 halcon標(biāo)定助手
標(biāo)定板生成:
標(biāo)定板文件的生成分為.descr和.cpd的文件,不同格式文件需使用不同函數(shù)進(jìn)行生成。如,
*生成的是27*31,標(biāo)定點直徑0.0075mm的.cpd標(biāo)定板(精度高標(biāo)定板)
create_caltab (27, 31, 0.0075, [13, 6, 6, 20, 20], [15, 6, 24, 6, 24], 'light_on_dark', 'D:/calplate.cpd', 'caltab.ps')
*生成的是7*7,標(biāo)定點之間距離0.1m,直徑0.5的.descr標(biāo)定板
gen_caltab( 7, 7, 0.1, 0.5, 'D:/caltab.descr', 'caltab.ps')
加載標(biāo)定圖像:
圖5加載標(biāo)定圖像
如圖5所示,加載標(biāo)定圖像后,狀態(tài)為確定時,表示標(biāo)定圖像可用于進(jìn)行標(biāo)定,然后通過標(biāo)定助手直接生成標(biāo)定代碼即可。
? ?如圖6所示,加載標(biāo)定圖像后,狀態(tài)為檢測出品質(zhì)問題,此原因大多是照片質(zhì)量問題,例如光照、對焦、曝光等,需按照halcon標(biāo)定注意事項的內(nèi)容拍攝照片。一般照片檢測出品質(zhì)問題也可以進(jìn)行相機(jī)標(biāo)定。
加載標(biāo)定板圖像會出現(xiàn)“標(biāo)志點提取失敗”,出現(xiàn)此原因的需要根據(jù)標(biāo)定界面下的狀態(tài)欄查找halcon錯誤信息,例”inconsistent....(image mirrored? )”,則需要查找相應(yīng)原因(實際標(biāo)定板(透明)與標(biāo)定板文件圖片的可能有鏡像區(qū)別,將實際標(biāo)定板翻轉(zhuǎn)即可,多試)。此不可進(jìn)行相機(jī)標(biāo)定。
圖6 相機(jī)標(biāo)定問題
相機(jī)初始參數(shù)設(shè)置:
例如,
*(f, k, cell width, cell height, cx, cy, width, height)k為畸變系數(shù)
StartParameters := [0.029,0,4.3e-006,4.3e-006,2592,1728,5184,3456]
*(f, k1, k2, k3, p1, p2, cell width, cell height, cx, cy, width, height)k1,k2,k3徑向畸變, p1,p2為切向畸變
StartParameters:=[0.029,0,0,0,0,0,4.3e-006,4.3e-006,2592,1728,5184,3456]
其中,相機(jī)初始參數(shù)根據(jù)相機(jī)模型的不同而不同,若相機(jī)模型為area(division),則相機(jī)參數(shù)為7個,若area(多項式),則相機(jī)參數(shù)12個。
1.1.2 標(biāo)定程序
利用標(biāo)定助手生成代碼,然后執(zhí)行結(jié)果,分析其正確性,若需要將其生成為C/C++程序,可通過halcon界面的‘文件’項‘導(dǎo)出’成.cpp文件。
圖7 halcon生成C程序
Halcon標(biāo)定程序
*Calibration 01: Code generated by Calibration 01*讀入某個文件夾下的所有標(biāo)定圖像list_files ('D:/halconvc/img', ['files','follow_links'], ImageFiles)tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)*初始標(biāo)定參數(shù)設(shè)置及定義標(biāo)定板文件TmpCtrl_ReferenceIndex := 0TmpCtrl_PlateDescription := 'D:/calib/calplate.cpd'StartParameters := [0.029,0,0,0,0,0,4.3e-006,4.3e-006,2592,1728,5184,3456]TmpCtrl_FindCalObjParNames := 'sigma'TmpCtrl_FindCalObjParValues := 1 * Calibration 01: Create calibration model for managing calibration datacreate_calib_data ('calibration_object', 1, 1, CalibHandle)set_calib_data_cam_param(CalibHandle,0,'area_scan_polynomial', StartParameters)set_calib_data_calib_object (CalibHandle, 0, TmpCtrl_PlateDescription)* Calibration 01: Collect mark positions and estimated poses for all platesgen_empty_obj (Images)for Index := 0 to |ImageFiles|-1 by 1 read_image (Image, ImageFiles[Index]) concat_obj(Images,Image,Images)*提取圖像Images中標(biāo)定板上的圓形標(biāo)志來確定標(biāo)定板的有效區(qū)域 find_calib_object (Image, CalibHandle, 0, 0, Index, TmpCtrl_FindCalObjParNames, TmpCtrl_FindCalObjParValues)endfor* Calibration 01: Perform the actual calibrationcalibrate_cameras (CalibHandle, TmpCtrl_Errors)get_calib_data (CalibHandle, 'camera', 0, 'params', CameraParam) *將內(nèi)外參保存到磁盤write_cam_par(CameraParam,'D:/halconvc/campar.dat')get_calib_data (CalibHandle, 'calib_obj_pose', [0, TmpCtrl_ReferenceIndex], 'pose', CameraPose)set_origin_pose (CameraPose, 0, 0, 0.01, CameraPose)write_pose(CameraPose,'D:/halconvc/campos.dat')stop() *另外讀取內(nèi)外參文件的函數(shù)read_cam_par ('D:/halconvc/campar.dat', CameraParam)read_pose ('D:/halconvc/campos.dat', CameraPose)1.2圖像矯正
Halcon中圖像矯正,接上述程序,以下介紹兩種方法。
①使用內(nèi)外參,即相機(jī)內(nèi)參和位姿
②僅使用內(nèi)參
read_image (Image,'D:/halconvc/img/IMG_00.JPG')read_cam_par('D:/halconvc/campar.dat',CameraParam)CarParamVirtualFixed:=CameraParam*對于area(diversion)相機(jī)模型(7個參數(shù))change_radial_distortion_cam_par('adaptive',CameraParam,0,CarParamVirtualFixed)*對于area(多項式)相機(jī)模型(12個參數(shù))change_radial_distortion_cam_par('adaptive',CameraParam,[0,0,0,0,0],CarParamVirtualFixed) *上述相機(jī)模型選一種后進(jìn)行下面的map_image*創(chuàng)建一個投射圖,其描述圖像與其相應(yīng)正在改變的徑向畸變,而對于12個參數(shù)的畸變包括徑向和切向畸變gen_radial_distortion_map(Map,CameraParam,CarParamVirtualFixed,'bilinear')map_image(Image,Map,ImageMapped)總結(jié):
可以先使用標(biāo)定助手獲取標(biāo)定參數(shù)
在標(biāo)定助手的安裝頁面,注意標(biāo)定板的描述文件,投影模型參數(shù)的設(shè)置
在標(biāo)定頁面先選擇一幅圖設(shè)為參考位姿,之后點擊標(biāo)定
標(biāo)定完之后獲得相機(jī)內(nèi)參,圖片矯正程序方法
* Calibration 01: Code generated by Calibration 01CameraParameters := ['area_scan_division',0.0186441,-520.011,8.35005e-006,8.3e-006,246.657,254.674,640,480]CameraPose := [0.00994196,-0.00291689,0.290462,358.424,32.411,91.0749,0]stop ()*獲取徑向畸變矯正的外參change_radial_distortion_cam_par ('adaptive', CameraParameters, 0, CamParamOut) read_image (CalibDistorted03, 'C:/Users/Public/Documents/MVTec/HALCON-13.0/examples/images/scratch/scratch_perspective.png')*第一種方法使用map_image()進(jìn)行畸變矯正gen_radial_distortion_map (Map, CameraParameters, CamParamOut, 'bilinear')map_image (CalibDistorted03, Map, ImageMapped)*第二種方法使用change_radial_distortion_image進(jìn)行徑向畸變矯正change_radial_distortion_image (CalibDistorted03,CalibDistorted03 , ImageRectified, CameraParameters, CamParamOut)此種只進(jìn)行畸變矯正,并不進(jìn)行圖像的由于高度差造成的3D方向的位姿矯正。若要進(jìn)行3D方向的矯正可以參考范例
image_to_world_plane.hdev
畸變矯正范例為:
change_radial_distortion_image.hdev
change_radial_distortion_points.hdev
?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Halcon: 畸变矫正与标定(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Halcon:Image、region、
- 下一篇: Halcon :畸变矫正与标定(2)