opencv中标定函数calibrateCamera

世界坐标系的三维点投影到成像坐标系中的二维点的投影公式如下:

其中(X,Y,Z)为世界坐标系中的三维点;

u,v)为成像面坐标系中的二维点;

A为相机的内参数矩阵:(cx,cy)为主光轴点,一般为图像的中心;fxfy为焦距;

[R|t]为相机的外参数矩阵:R为旋转矩阵,t为位移矩阵;

上述公式的简单推理过程如下

考虑到镜头畸变

其中,k1,k2,k3,k4,k5k6为径向畸变,p1p2为轴向畸变。在opencv中,畸变矩阵的参数为(k1,k2,p1,p2[,k3[,k4,k5,k6]]])

Opencv中的标定模块常用的标定函数:

double calibrateCamera(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints,Size imageSize, InputOutputArray cameraMatrix, InputOutputArray distCoeffs, OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, int flags=0)


其中

objectPoints为世界坐标系中的点。在使用时,应该输入一个三维点的vectorvector,即vector<vector<Point3f>> objectPoints

imagePoints为其对应的图像点。和objectPoints一样,应该输入std::vector<std::vector<cv::Point2f>> imagePoints型的变量。

imageSize为图像的大小,在计算相机的内参数和畸变矩阵需要用到;

cameraMatrix为内参数矩阵。输入一个cv::Mat cameraMatrix即可。

distCoeffs为畸变矩阵。输入一个cv::Mat distCoeffs即可。

rvecs为旋转向量;应该输入一个cv::Matvector,即vector<cv::Mat> rvecs因为每个vector<Point3f>会得到一个rvecs。

tvecs为位移向量;和rvecs一样,也应该为vector<cv::Mat> tvecs。

flags为标定是所采用的算法。可如下某个或者某几个参数:

CV_CALIB_USE_INTRINSIC_GUESS:使用该参数时,在cameraMatrix矩阵中应该有fx,fy,cx,cy的估计值。否则的话,将初始化(cx,cy)图像的中心点,使用最小二乘估算出fxfy如果内参数矩阵和畸变居中已知的时候,应该标定模块中的solvePnP()函数计算外参数矩阵。

CV_CALIB_FIX_PRINCIPAL_POINT:在进行优化时会固定光轴点。当CV_CALIB_USE_INTRINSIC_GUESS参数被设置,光轴点将保持在中心或者某个输入的值。

CV_CALIB_FIX_ASPECT_RATIO:固定fx/fy的比值,只将fy作为可变量,进行优化计算。当CV_CALIB_USE_INTRINSIC_GUESS没有被设置,fxfy将会被忽略。只有fx/fy的比值在计算中会被用到。

CV_CALIB_ZERO_TANGENT_DIST:设定切向畸变参数(p1,p2)为零。

CV_CALIB_FIX_K1,...,CV_CALIB_FIX_K6:对应的径向畸变在优化中保持不变。如果设置了CV_CALIB_USE_INTRINSIC_GUESS参数,

CV_CALIB_RATIONAL_MODEL:计算k4k5k6三个畸变参数。如果没有设置,则只计算其它5个畸变参数。

在使用calibrateCamera标定前,一般使用findChessboardCorners()函数获得棋盘标定板的角点位置。

还需要注意的是,在目前的opencv版本中(opencv2.4),当需要计算获得内参数矩阵时,即不使用CV_CALIB_USE_INTRINSIC_GUESS参数时,要求输入的objectPoints的为平面标定模式,即Z轴都为零。否则会出错。

如果对calibrateCamera的详细算法感兴趣,可以阅读张正友的标定算法A Flexible New Technique for Camera Calibration。可以从google scholar上搜索下载。

calibrateCamera的使用例子:

	int cols = 10;
	int rows = 7;
	float distance = 30;	//间距30mm

	cv::Size patternSize(cols,rows);
	std::vector<cv::Point2f> corners;
	std::vector<std::vector<cv::Point2f>> cornersVect;
	std::vector<cv::Point3f> worldPoints;
	std::vector<std::vector<cv::Point3f>> worldPointsVect;

	for (int i=0;i<cols;i++)
	{
		for (int j=0;j<rows;j++)
		{
			worldPoints.push_back(cv::Point3f(i*distance,j*distance,0));
		}
	}
	
	bool find=cv::findChessboardCorners(image,patternSize,corners);
	cv::drawChessboardCorners(image,patternSize,corners,find);
	cv::Mat cameraMatirx,distCoeffs;
	std::vector<cv::Mat> rvecs,tvecs,rvecs2,tvecs2;
	if (find)
	{	
		cornersVect.push_back(corners);
		worldPointsVect.push_back(worldPoints);
		cv::calibrateCamera(worldPointsVect,cornersVect,image.size(),cameraMatirx,distCoeffs,rvecs,tvecs);
	}



  • 13
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
### 回答1: OpenCV是一个开源的计算机视觉库,提供了很多计算机视觉相关的函数和算法。相机标定是计算机视觉一个重要的步骤,用于确定相机的内参和外参参数,从而提高计算机视觉的精确度。 opencv相机标定例程是使用OpenCV函数进行相机标定的示例代码。它包含了一系列对相机进行标定的步骤: 1. 收集标定图像:首先需要收集一组标定图像,这些图像应该包含特定的模式,比如棋盘格。这些图像可以通过相机拍摄或者从其他来源获取。 2. 提取角点:使用OpenCV函数标定图像提取角点。这些角点的提取可以通过函数`findChessboardCorners`来实现,它会返回检测到的角点的坐标。 3. 标定相机:使用提取到的角点坐标,调用OpenCV函数`calibrateCamera`完成相机的标定。该函数将返回相机的内参矩阵,畸变系数和旋转矩阵。 4. 评估标定结果:标定完成后,可以使用OpenCV函数`getOptimalNewCameraMatrix`来优化内参矩阵,并使用`initUndistorRectifyMap`函数生成畸变校正的映射。 5. 应用标定结果:使用标定得到的内参矩阵和畸变系数,可以对图像进行畸变校正,使得图像不再有畸变。 OpenCV相机标定例程提供了一个完整的流程,帮助用户准确地对相机进行标定,从而提高计算机视觉算法的准确性和鲁棒性。同时,用户可以根据自己的需求,对例程进行修改和扩展,以适应具体的应用场景。 ### 回答2: OpenCV相机标定例程是一个用于校准相机的程序。相机标定是指确定相机内部和外部参数的过程,以便在三维世界更准确地测量物体或跟踪物体。 首先,我们需要收集一些被称为棋盘格的二维图像。在例程,我们使用棋盘格作为标定目标,因为它具有规则的结构和易于检测的特征。然后,我们将这些图像加载到程序进行处理。 接下来,我们使用OpenCV标定函数来计算相机的内部参数,例如焦距、主点坐标和径向畸变系数。这些参数将用于校正图像并更准确地测量物体。 在这个例程,我们使用棋盘格的角点作为特征点来进行标定。我们可以通过使用OpenCV函数在棋盘格图像检测角点。然后,我们将这些角点的二维像素坐标与它们在三维空间的真实坐标进行匹配。 通过对多个图像进行角点的检测和匹配,我们可以获得足够的数据来计算相机的内部参数。一旦内部参数被计算出来,我们就可以将其保存在文件以备将来使用。 通过相机标定例程,我们可以获得相机的校准参数,从而提高图像的质量和精度。这在计算机视觉应用特别重要,例如目标跟踪、SLAM(同时定位与地图构建)和立体视觉。 ### 回答3: OpenCV相机标定例程是一种用于标定相机内外参数的方法。相机标定是指确定相机的一些固有参数,如焦距、畸变等,以便于后续图像处理或计算机视觉任务的进行。 OpenCV提供了一个相机标定例程函数`calibrateCamera()`,通过将相机拍摄的多张已知世界坐标和相应图像坐标的图像进行处理,来估计相机的内外参数。 首先,需要收集一组已知世界坐标和相应图像坐标的图像样本。已知世界坐标通常需要以某个坐标系为基准,例如一个棋盘格。然后,通过使用OpenCV提供的函数`findChessboardCorners()`来检测图像棋盘格角点的位置。 接下来,通过调用`calibrateCamera()`函数,将已知的世界坐标和对应的图像坐标作为输入参数,获得相机的内外参数。该函数将返回相机的一些参数,如相机矩阵、畸变系数、旋转矩阵和平移向量等。 最后,可以使用相机的内外参数进行图像处理或计算机视觉任务。例如,可以通过使用函数`undistort()`对相机采集到的图像进行去畸变操作,从而使图像更符合实际场景。 总之,OpenCV相机标定例程是一种用于确定相机内外参数的方法,通过使用已知的世界坐标和图像坐标的样本,可以得到相机的一些固有参数,以便于后续的图像处理或计算机视觉任务。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值