(結構光代碼篇)相機標定+投影儀標定

主要關注操作

相機標定

利用OpenCV(單目)相機標定函數calibrateCamera(),僅需要已知角點的世界座標、角點的圖片座標、圖片的尺寸,代入函數即可得到相機的內外各類參數。

世界座標的獲取

以棋盤格所在平面作爲世界座標系的xoyxoy平面,原點可以選擇爲棋盤格的第一個角點(隨便選)。
需要已知:

  1. 棋盤格中含有內角點的個數Size board_size=Size(13,7)
  2. 格子的真實尺寸Size square_size=Size(28.13,28.13),單位是mm
    以此分配角點的世界座標
vector<Point3f> world_points;
for(int i=0;i<board_size.width;i++)
{
	for(int j=0;j<board_size.hegight;j++)
	{	
		Point3f Wpoint;
		Wpoint.x=i*square_size.width;
		Wpoint.y=j*square_size.height;
		Wpoint.z=0;
		world_points.pushback(Wpoint);
	}
}

一般xx軸對應width,yy軸對應height。

圖片角點的獲取

步驟如下:

  1. 提取角點,使用OpenCV中的findChessboardCorners()
  2. 若提取角點成功,則對角點進行亞像素精確connerSubPix()
Mat image=read("   ");
if(0==findChessboardCorners(image,board_size,image_points,3))
{
	cout<<"can not find conners"<<endl;
	return;
}
else
{
	Mat gray_img;
	if(image.channels()>1)
	cvtColor(image,gray_img,CV_RGB2GRAY);
	else image.copyTo(gray_img);
	connerSubPix(gray_img,image_points,Size(5,5),Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
}

標定

得到多組(12-20組)圖片的角點以及對應的世界座標之後,即可調用函數cameraCalibrate()

cameraCalibrate(World_Points,image_points,image_size,camera_matrix,distcoeffs,R,T,0);

只需要注意,World_Points,image_pointsvector<vector<Points>>,與圖片的張數對應。

投影儀標定

世界座標獲取

投影儀的投影角點世界座標通過相機爲媒介獲得。上一篇講到,採集圖片的時候保證投影圖片與打印圖片在同一個平面,就是因爲這個目的。
以相機已經標定爲前提。
步驟:

  1. 通過相機採集的圖片得到投影的角點vector<Point2f> pro_imgpointsfindChessboardCorners()
  2. 通過相機標定的參數計算上述角點的世界座標vector<Point3f> pro_wordpoints
vector<Point2f> pro_imgpoints;
if(0==findChessboardCorners(image,pro_board_size,pro_imgpoints,3))
return;
else
{
Mat gray_img;
if(image.channels()>1)
cvtColor(image,gray_img,CV_RGB2GRAY);
else image.copyTo(gray_img);
connerSubPix(gray_img,pro_imgpoints,Size(5,5),Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
}

///
Mat h(3, 3, CV_32FC1);
h = findHomography(image_points, world_points, RANSAC);
Mat homo=Mat(3,3,cv_32FC1,Scalar(0));
h.copyTo(homo);
homo.convertTo(homo,CV_32FC1);
for(int i=0;i<pro_imgpoints.size();i++)
{
	Point3f pro_wpoint,pro_img_point1;
	pro_img_point1.x=pro_imgpoints[i].x;
	pro_img_point1.y=pro_imgpoints[i].y;
	pro_img_point1.z=1;//齊次座標
	pro_wpoint=homo*pro_img_point1;
	pro_wpoint.x=pro_wpoint.x/pro_wpoint.z;
	pro_wpoint.y=pro_wpoint.y/pro_wpoint.z;
	pro_wpoint.z=0;
	pro_worldpoints.pushback(pro_wpoint);
}

圖片角點的獲取

用於投影的圖片相當於投影儀“採集”的圖片,直接求其角點座標即可。

標定

同相機標定,調用cameraCalibrate()函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章