單應性矩陣計算(相機標定)時點的提取
阿新 • • 發佈:2018-12-13
一、角點檢測
cv::goodFeaturesToTrack() 檢測整個影象內的角點 本例子裡面無法使用。
執行後的結果如圖所示:
使用findChessboardCorners() 自動尋找板內的角點
//! finds checkerboard pattern of the specified size in the image CV_EXPORTS_W bool findChessboardCorners( InputArray image, Size patternSize, OutputArray corners, int flags=CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE );
第一個引數Image,傳入拍攝的棋盤圖Mat影象,必須是8位的灰度或者彩色影象;
第二個引數patternSize,每個棋盤圖上內角點的行列數,一般情況下,行列數不要相同,便於後續標定程式識別標定板的方向;
第三個引數corners,用於儲存檢測到的內角點影象座標位置,一般用元素是Point2f的向量來表示:vector<Point2f> image_points_buf;
第四個引數flage:用於定義棋盤圖上內角點查詢的不同處理方式,有預設值。
用這個函式檢測,執行後結果如圖:
二、根據兩幅影象找到對應點
做法同上一步,對兩幅影象進行同樣的操作,之後可以得到兩幅圖中一一對應的點,這樣座標就找到了,然後就可以進行H鎮的計算。只需要在corners中取相應位置的點即可。
對兩幅圖處理,結果如圖:
此部分程式碼如下:
int main( int argc, char** argv ) { Mat img1 = imread( "left3.jpg"); if( img1.empty() ) return -1; Mat img2 = imread("left4.jpg"); if( img2.empty() ) return -1; cv::Mat image_gray1; cvtColor(img1, image_gray1, cv::COLOR_BGR2GRAY); //設定角點檢測引數 std::vector<cv::Point2f> corners1; //儲存檢測到的點 Size board_size1 = Size(6,9); //角點檢測 findChessboardCorners(image_gray1,board_size1,corners1); //將檢測到的角點繪製到原圖上 for (int i = 0; i < corners1.size(); i++) { cv::circle(img1, corners1[i], 1, cv::Scalar(0, 0, 255), 2, 8, 0); } cv::imshow("house corner1", img1); //同樣處理 cv::Mat image_gray2; cvtColor(img2, image_gray2, cv::COLOR_BGR2GRAY); //設定角點檢測引數 std::vector<cv::Point2f> corners2; //儲存檢測到的點 Size board_size2 = Size(6,9); //角點檢測 findChessboardCorners(image_gray2,board_size2,corners2); //將檢測到的角點繪製到原圖上 for (int i = 0; i < corners2.size(); i++) { cv::circle(img2, corners2[i], 1, cv::Scalar(0, 0, 255), 2, 8, 0); } cv::imshow("house corner2", img2); waitKey( 0 ); }
好了,點找到了,方程根據上一篇也有了,接下來就可以進行H矩陣的求取了