1. 程式人生 > >【程式碼】python+opencv實現相機標定

【程式碼】python+opencv實現相機標定

詳細流程講解:

opencv官方文件翻譯版:

1. 準備標定影象

相機標定是進行視覺測量和定位的基礎工作之一,標定引數準確與否直接關係到整個系統的精度,為此根據自己專案中的經驗及參考相關的商用視覺軟體的做法將相機標定過程中標定圖片的獲取過程中需要注意的問題總結如下:

    標定板拍攝的張數要能覆蓋整個測量空間及整個測量視場,把相機影象分成四個象限(如圖1所示),應保證拍攝的標定板影象均勻分佈在四個象限中,且在每個象限中建議進行不同方向的兩次傾斜,圖2是一組推薦擺放方式圖片。

    標定圖片的數量通常在15~25張之間,影象數量太少,容易導致標定引數不準確。

    圓或者圓環特徵的畫素數儘量大於20,標定板的成像尺寸應大致佔整幅畫面的1/4

    用輔助光源對標定板進行打光,保證標定板的亮度足夠且均勻

    標定板成像不能過爆,過爆會導致特徵輪廓的提取的偏移,從而導致圓心提取不準確。

    標定板特徵成像不能出現明顯的離焦距,出現離焦時可通過調整調整標定板的距離、光圈的大小和像距(對於定焦鏡頭,通常說的調焦就是指調整像距)。

    標定過程,相機的光圈、焦距不能發生改變,改變需要重新標定。 --------------------- 作者:半路猿 來源:CSDN 原文:https://blog.csdn.net/j_shui/article/details/77262947 版權宣告:本文為博主原創文章,轉載請附上博文連結!

 2.標定影象角點檢測:cv2.findChessboardCorners

retval, corners	=cv.findChessboardCorners(image, patternSize[, corners[, flags]])

引數:

image:棋盤影象,8位灰度或彩色影象。

patternSize:棋盤的尺寸(注意應為內角點個數,內角點是和其他格子連著的點,邊邊上的不是!!不是不是不是有幾個方格!!比如說“田”字只有一個內角點!!

corners:存放角點的位置。

flags:迭代的準則

返回值:

retval:是否檢測出角點

corners:角點的位置。

3. 角點精確檢測 cv2.cornerSubPix

corners	= cv.cornerSubPix( image, corners, winSize, zeroZone, criteria	)

引數:

image:輸入影象,8位或者float型。

corners:角點初始座標。

winsize:搜尋視窗為2*winsize+1。

zerozone:死區,不計算區域,避免自相關矩陣的奇異性。沒有死區,引數為(-1,-1)

criteria:求角點的迭代終止條件。

返回值:

corner:角點位置。

**(可選)顯示角點位置:cv2.drawChessboardCorners

image	=cv.drawChessboardCorners(image, patternSize, corners, patternWasFound	)

patternWasFound:標誌位,檢測是否所有board(不太理解什麼意思?)都被檢測到,若為是,則將角點連線,否則不連線。

其他同2。

4.進行標定,計算引數 cv2.calibrateCamera

retval, cameraMatrix, distCoeffs, rvecs, tvecs	=	
                                    cv.calibrateCamera(
                                    objectPoints, imagePoints, imageSize, cameraMatrix, 
                                    distCoeffs[, rvecs[, tvecs[, flags[, criteria]]]]
)

objectPoints:世界座標系裡的位置。

imagePoints: 畫素座標。

imageSize:為影象的畫素尺寸大小。

cameraMatrix:3*3矩陣,相機內參數矩陣。

disCoeffs:畸變矩陣

rvecs:旋轉向量

tvecs:位移向量

flags:標定採用的演算法

criteria:迭代終止條件設定。

5.矯正影象 cv2.getOptimalNewCameraMatrix

retval, validPixROI = cv.getOptimalNewCameraMatrix(	
                        cameraMatrix, distCoeffs, imageSize, 
                        alpha[, newImgSize[, centerPrincipalPoint]]	)

imageSize:原始影象尺寸。

newImageSize:校正後影象尺寸。

alpha:取0或1。0返回剪裁後圖像,1返回有黑色區域的影象,ROI是一個矩形框,圈出最優的裁切範圍。詳情請看:

總結一下:就是因為矯正,留下了很多黑色空洞,為了剪掉黑色區域並且保持原影象比例,opencv丟掉了很多畫素,因此畫素出現了缺失。

centerPrincipalPoint:是否作用於中心。預設為opencv自己根據影象選擇位置。

6.獲得最終結果:cv2.undistort

dst = cv.undistort(	src, cameraMatrix, distCoeffs[, dst[, newCameraMatrix]]	)

scr:待矯正圖片。

dst:輸出影象。