緒:
OpenCV相機標心猿意馬采用張正友標心猿意馬法,
以棋盤格為東西,
以棋盤角點圖像像素坐標和棋盤角點宿世界坐標系坐標為輸入,
輸出相機的內參、外參。
本經驗本家兒要介紹:
(1)棋盤角點圖像像素坐標系坐標;
(2)棋盤角點宿世界坐標系坐標;
(3)相機標心猿意馬;
(4)相機標心猿意馬成果評價;
(5)圖像畸變矯正;
(6)標心猿意馬法式;
棋盤角點圖像像素坐標
步調如下:
①提取棋盤格圖像內角點-粗角點坐標;
③對粗角點坐標進行亞像素角點提取;
④在棋盤標心猿意馬圖上繪制找到的亞像素內角點(僅顯示內角點);
①棋盤格內角點提取函數findChessboardCorners:
bool findChessboardCorners( InputArray image,
Size patternSize, //內角點行列數
OutputArray corners,
int flags=CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE);
第一個參數image,是8位灰度、彩色圖像;
第二個參數patternSize,每個棋盤圖上內角點的行列數,一般環境下,行列數不要不異,便于后續標心猿意馬法式識別標心猿意馬板的偏向;
第三個參數corners,用于存儲檢測到的內角點圖像坐標位置,一般用元素是Point2f的標的目的量來暗示:vector<Point2f> image_points_buf;
第四個參數flags:用于界說棋盤圖上內角點查找的分歧處置體例,有默認值。
②提取亞像素角點信息:
為了提高標心猿意馬精度,在提取的角點信息長進一步提取亞像素信息,降低相機標心猿意馬誤差;
兩種方式;一種方式cornerSubPix;另一種方式find4QuadCornerSubpix函數;
void cornerSubPix( InputArray image,
InputOutputArray corners,
Size winSize,
Size zeroZone,
TermCriteria criteria );
第一個參數image,是8位灰度圖像;
第二個參數corners,輸入初始的角點坐標標的目的量,輸出亞像素坐標位置,浮點型數據,一般用元素是Pointf2f/Point2d的標的目的量來暗示:vector<Point2f/Point2d> imagePointsBuf;
第三個參數winSize,巨細為搜刮窗口的一半;
第四個參數zeroZone,死區的一半尺寸,死區為不合錯誤搜刮區的中心位置做乞降運算的區域。它是用來避免自相關矩陣呈現某些可能的奇異性。當值為(-1,-1)時暗示沒有死區;
第五個參數criteria,迭代過程的終止前提,可覺得迭代次數和角點精度兩者的組合;
bool find4QuadCornerSubpix(InputArray img,
InputOutputArray corners,
Size region_size);
第一個參數img,是8位灰度圖像;
第二個參數corners,輸入初始的角點坐標標的目的量,輸出亞像素坐標位置,浮點型數據,一般用元素是Pointf2f/Point2d的標的目的量來暗示:vector<Point2f/Point2d> imagePointsBuf;
第三個參數region_size,角點搜刮窗口的尺寸;
對比cornerSubPix和find4QuadCornerSubpix:
在標心猿意馬圖上別離運行cornerSubPix和find4QuadCornerSubpix尋找亞像素角點,
兩者定位到的亞像素角點坐標別離為:
固然兩者有必然差距,但誤差根基都節制在0.5個像素之內。
③在圖像上繪制內角點drawChessboardCorners用于繪制被當作功標心猿意馬的角點
void drawChessboardCorners( InputOutputArray image,
Size patternSize,
InputArray corners,//亞像素角點
bool patternWasFound );
第一個參數image,8位灰度或者彩色圖像;
第二個參數patternSize,每張標心猿意馬棋盤上內角點的行列數;
第三個參數corners,輸入亞像素坐標位置,浮點型數據,一般用元素是Pointf2f/Point2d的標的目的量來暗示:vector<Point2f/Point2d> iamgePointsBuf;
第四個參數patternWasFound,標記位,用來指示界說的棋盤內角點是否被完整的探測到,true暗示別完整的探測到,函數會用直線依次毗連所有的內角點,作為一個整體,false暗示有未被探測到的內角點,這時辰函數會以圓圈標識表記標幟處檢測到的內角點;
patternWasFound設置為true和false時內角點的繪制結果:ture時,依次毗連各個內角點;false圓圈暗示;
棋盤角點宿世界坐標系坐標:
以棋盤格左上角為宿世界坐標系原點,成立宿世界坐標系,
則棋盤角點宿世界坐標系下的坐標計較,如下:
/*棋盤三維信息*/
Size square_size = Size(10,10); /* 每個棋盤格真實尺寸 */
vector<vector<Point3f>> object_points; /* 標心猿意馬板上角點的三維坐標 */
/* 初始化標心猿意馬板上角點的三維坐標 */
int i,j,t;
for (t=0;t<image_count;t++)
{
vector<Point3f> tempPointSet;
for (i=0;i<board_size.height;i++)
{
for (j=0;j<board_size.width;j++)
{
Point3f realPoint; /* 假設標心猿意馬板放活著界坐標系中z=0的平面上 */
realPoint.x = i*square_size.width; //hang
realPoint.y = j*square_size.height; //lie
realPoint.z = 0;
tempPointSet.push_back(realPoint);
}
}
object_points.push_back(tempPointSet);
}
相機標心猿意馬計較相機表里參數;
double calibrateCamera( InputArrayOfArrays objectPoints,
InputArrayOfArrays imagePoints,
Size imageSize,
InputOutputArray cameraMatrix,
InputOutputArray distCoeffs,
OutputArrayOfArrays rvecs,
OutputArrayOfArrays tvecs,
int flags=0,
TermCriteria criteria
= TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30,DBL_EPSILON) );
第一個參數objectPoints,輸入一個三維坐標點的標的目的量的標的目的量,即vector<vector<Point3f>> object_points。依據棋盤上單個口角矩陣的巨細,計較出每一個內角點的宿世界坐標。
第二個參數imagePoints,輸入每一個內角點對應的圖像坐標點,vector<vector<Point2f>> image_points_seq類型;
第三個參數imageSize,為圖像的像素尺寸巨細,在計較相機的內參和畸變矩陣時需要利用到該參數;
第四個參數cameraMatrix為相機的內參矩陣。輸入一個Mat cameraMatrix即可,如Mat cameraMatrix=Mat(3,3,CV_32FC1,Scalar::all(0));
第五個參數distCoeffs為畸變矩陣。輸入一個Mat distCoeffs=Mat(1,5,CV_32FC1,Scalar::all(0))即可;
第六個參數rvecs為扭轉標的目的量;應該輸入一個Mat類型的vector,即vector<Mat>rvecs;
第七個參數tvecs為位移標的目的量,和rvecs一樣,應該為vector<Mat> tvecs;
第八個參數flags為標按時所采用的算法。有如下幾個參數:
CV_CALIB_USE_INTRINSIC_GUESS:利用該參數時,在cameraMatrix矩陣中應該有fx,fy,u0,v0的估量值。不然,將初始化(u0,v0)圖像的中間點,利用最小二乘估算出fx,fy。
CV_CALIB_FIX_PRINCIPAL_POINT:在進行優化時會固心猿意馬光軸點。當CV_CALIB_USE_INTRINSIC_GUESS參數被設置,光軸點將連結在中間或者某個輸入的值。
CV_CALIB_FIX_ASPECT_RATIO:固心猿意馬fx/fy的比值,只將fy作為可變量,進行優化計較。當CV_CALIB_USE_INTRINSIC_GUESS沒有被設置,fx和fy將會被忽略。只有fx/fy的比值在計較中會被用到。
CV_CALIB_ZERO_TANGENT_DIST:設心猿意馬切標的目的畸變參數(p1,p2)為零。
CV_CALIB_FIX_K1,…,CV_CALIB_FIX_K6:對應的徑標的目的畸變在優化中連結不變。
CV_CALIB_RATIONAL_MODEL:計較k4,k5,k6三個畸變參數。若是沒有設置,則只計較其它5個畸變參數。
第九個參數criteria是最優迭代終止前提設心猿意馬。
在利用該函數進行標心猿意馬運算之前,需要對棋盤上每一個內角點的空間坐標系的位置坐標進行初始化,標心猿意馬的成果是生當作相機的內參矩陣cameraMatrix、相機的5個畸變系數distCoeffs,別的每張圖像城市生當作屬于本身的平移標的目的量和扭轉標的目的量。
相機標心猿意馬成果評價projectPoints:
以獲取的相機表里參數為輸入,
計較空間三維點在圖像上的重投影點坐標和亞像素角點坐標之間的誤差;
誤差越小,標心猿意馬成果越好;
①對空間三維坐標點進行反標的目的投影的函數是projectPoints;
void projectPoints( InputArray objectPoints,
InputArray rvec,
InputArray tvec,
InputArray cameraMatrix,
InputArray distCoeffs,
OutputArray imagePoints, //投影點
OutputArray jacobian=noArray(),
double aspectRatio=0 );
第一個參數objectPoints,為相機坐標系中的三維點坐標;
第二個參數rvec為扭轉標的目的量,每一張圖像都有本身的扭轉標的目的量;
第三個參數tvec為平移標的目的量,每一張圖像都有本身的平移標的目的量;
第四個參數cameraMatrix為相機的內參數矩陣;
第五個參數distCoeffs為相機的畸變矩陣;
第六個參數imagePoints為每一個內角點對應的圖像上的坐標點;
第七個參數jacobian是雅可比行列式;
第八個參數aspectRatio是跟相機傳感器的感光單位有關的可選參數,若是設置為非0,則函數默認感光單位的dx/dy是固心猿意馬的,會依此對雅可比矩陣進行調整;
②誤差計較:以opencv里的norm把這里的兩個通道別離分隔來計較的(X1-X2)^2的值,然后同一乞降,最后進行根號;
double norm(InputArray src1,
InputArray src2,
int normType=NORM_L2,
InputArray mask=noArray());
以圖片的亞像素角點坐標和按照標心猿意馬成果把空間三維坐標點映射到圖像坐標點的對比:
圖像矯正:操縱標心猿意馬成果對圖像進行矯正
方式一:initUndistortRectifyMap和remap相連系實現。
initUndistortRectifyMap計較畸變映射,remap把求得的畸變映射應用到圖像上。
void initUndistortRectifyMap(InputArray cameraMatrix,
InputArray distCoeffs,
InputArray R,
InputArray newCameraMatrix,
Size size,
int m1type,
OutputArray map1,
OutputArray map2 );
第一個參數cameraMatrix為之前求得的相機的內參矩陣;
第二個參數distCoeffs為之前求得的相機畸變矩陣;
第三個參數R,扭轉矩陣;
第四個參數newCameraMatrix,輸入的校正后的3X3攝像機矩陣;
第五個參數size,攝像機采集的無掉真的圖像尺寸;
第六個參數m1type,界說map1的數據類型,可所以CV_32FC1或者CV_16SC2;
第七個參數map1和第八個參數map2,輸出的X/Y坐標重映射參數;
void remap( InputArray src,
OutputArray dst,
InputArray map1,
InputArray map2,
int interpolation,
int borderMode=BORDER_CONSTANT,
const Scalar& borderValue=Scalar());
第一個參數src,輸入參數,代表畸變的原始圖像;
第二個參數dst,矯正后的輸出圖像,跟輸入圖像具有不異的類型和巨細;
第三個參數map1和第四個參數map2,X坐標和Y坐標的映射;
第五個參數interpolation,界說圖像的插值體例;
第六個參數borderMode,界說鴻溝填充體例;
方式二:undistort函數實現
void undistort( InputArray src,
OutputArray dst,
InputArray cameraMatrix,
InputArray distCoeffs,
InputArray newCameraMatrix=noArray() );
第一個參數src,輸入參數,代表畸變的原始圖像;
第二個參數dst,矯正后的輸出圖像,跟輸入圖像具有不異的類型和巨細;
第三個參數cameraMatrix為之前求得的相機的內參矩陣;
第四個參數distCoeffs為之前求得的相機畸變矩陣;
第五個參數newCameraMatrix,默認跟cameraMatrix連結一致;
方式一比擬方式二執行效率更高一些,保舉利用。
矯正成果比力:
0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!