1. 程式人生 > >單應性矩陣計算(相機標定)時點的提取

單應性矩陣計算(相機標定)時點的提取

一、角點檢測

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矩陣的求取了