opencv解释标定函数
- 1找标定板的角点
- 2.角点亚像素化
- 3.画出角点,用线连接
- 4,标定图片
- 5.对点重投影获得新的世界坐标
- 6,评价误差
- 博客参考
1找标定板的角点
CV_EXPORTS_W bool findChessboardCorners( InputArray image, Size patternSize, OutputArray corners, int flags = CALIB_CB_ADAPTIVE_THRESH CALIB_CB_NORMALIZE_IMAGE );
参数:1,输入图片,2,校准板尺寸(每行角数),3,输出角坐标,4,忽略默认值,可以满足我们的正常使用 以下函数更准确,可以与上述函数交换,只能输入前三个参数
CV_EXPORTS_AS(findChessboardCornersSBWithMeta) bool findChessboardCornersSB(InputArray image,Size patternSize, OutputArray corners, int flags,OutputArray meta);
举例:findChessboardCorners(imageInput, board_size, image_points_buf)
2.角点亚像素化
CV_EXPORTS_W bool find4QuadCornerSubpix( InputArray img, InputOutputArray corners, Size region_size );
参数:1,输入图像,2,输入角坐标,3,角搜索窗口的大小 以下函数也可以实现,但参数更复杂
CV_EXPORTS_W void cornerSubPix( InputArray image, InputOutputArray corners, Size winSize, Size zeroZone, TermCriteria criteria );
本函数的使用方法如下:
///指定亚像素计算迭代标注 cv::TermCriteria criteria = cv::TermCriteria( cv::TermCriteria::MAX_ITER cv::TermCriteria::EPS, 40, 0.01); ///亚像素检测 cv::cornerSubPix(image_gray, corners, cv::Size(5, 5) cv::Size(-1, -1), criteria);
3,画出角点并用线连起来
CV_EXPORTS_W void drawChessboardCorners( InputOutputArray image, Size patternSize,
InputArray corners, bool patternWasFound );
参数:1,输入需要输出的图像,2,角点尺寸(行列个数),3,角点坐标,4,findChessboardCorners函数返回值 举例:drawChessboardCorners(view_gray, board_size, image_points_buf, true); //用于在图片中标记角点
4,标定图片
下面这个函数是重载的那个,少了两个参数,但是一般都是使用这个函数,
CV_EXPORTS_W 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) );
参数: 1,世界坐标的点(令标定板平面为Z=0平面), 2,角点坐标(像素坐标), 3,图像大小, 4,
相机内参, 5,畸变系数, 6,每幅图片的旋转矩阵, 7,每幅图片的平移矩阵, 8,可以设置为0或者下面的一种或几种组合
CALIB_USE_INTRINSIC_GUESS cameraMatrix包含有效的fx, fy, cx, cy初始值,并进一步优化。否则,(cx, cy)最初被设置为图像中心(使用图像尺寸),并以最小二乘法计算焦距。注意,如果内在参数是已知的,就没有必要使用这个函数来估计外在参数。请使用solvePnP代替。 CALIB_FIX_PRINCIPAL_POINT 在全局优化过程中,主点不会改变。它保持在中心位置或在设置CALIB_USE_INTRINSIC_GUESS时指定的不同位置。 CALIB_FIX_ASPECT_RATIO 这些函数只考虑fy作为一个自由参数。fx/fy的比例与输入的cameraMatrix保持一致。当CALIB_USE_INTRINSIC_GUESS没有设置时,fx和fy的实际输入值被忽略,只有它们的比率被计算出来并进一步使用。 CALIB_ZERO_TANGENT_DIST 切向失真系数(p1,p2)被设置为零并保持为零。 CALIB_FIX_FOCAL_LENGTH 如果设置了CALIB_USE_INTRINSIC_GUESS,则在全局优化期间不改变焦距。 CALIB_FIX_K1,…, CALIB_FIX_K6 在优化过程中不改变相应的径向畸变系数。如果CALIB_USE_INTRINSIC_GUESS被设置,则使用提供的distCoeffs矩阵中的系数。否则,它被设置为0。 CALIB_RATIONAL_MODEL系数k4、k5和k6被启用。为了提供向后的兼容性,应该明确指定这个额外的标志,使校准函数使用有理模型并返回8个或更多的系数。 CALIB_THIN_PRISM_MODEL 启用系数s1、s2、s3和s4。为了提供向后的兼容性,应该明确指定这个额外的标志,以使校准函数使用薄棱镜模型并返回12个系数或更多。 CALIB_FIX_S1_S2_S3_S4 薄棱镜失真系数在优化过程中不改变。如果CALIB_USE_INTRINSIC_GUESS被设置,则使用提供的distCoeffs矩阵中的系数。否则,它被设置为0。 CALIB_TILTED_MODEL 系数tauX和tauY被启用。为了提供向后的兼容性,应该明确指定这个额外的标志,使校准函数使用倾斜的传感器模型并返回14个系数。 CALIB_FIX_TAUX_TAUY 倾斜传感器模型的系数在优化过程中不会改变。如果CALIB_USE_INTRINSIC_GUESS被设置,则使用提供的distCoeffs矩阵中的系数。否则,它被设置为0。
举例:calibrateCamera(object_points, image_points_seq, image_size, cameraMatrix, distCoeffs, rvecsMat, tvecsMat, 0);
5,对点做重投影得到新的世界坐标
CV_EXPORTS_W void projectPoints( InputArray objectPoints,
InputArray rvec, InputArray tvec,
InputArray cameraMatrix, InputArray distCoeffs,
OutputArray imagePoints,
OutputArray jacobian = noArray(),
double aspectRatio = 0 );
参数:
1,原始世界坐标,
2,图片旋转矩阵,
3,图片平移矩阵,
4,内参,
5,畸变系数,
6,计算出新的图像坐标
jacobian 可选输出2Nx(10+)图像点相对于旋转矢量、平移矢量、焦距、主点坐标和畸变系数的导数的jacobian矩阵。在旧的接口中,通过不同的输出参数返回雅各布矩阵的不同组成部分。 aspectRatio 可选的 "固定长宽比 "参数。如果该参数不为0,函数将假定长宽比(fx/fy)是固定的,并相应地调整雅各布矩阵。 该函数计算三维点对图像平面的二维投影,给定内在和外在的相机参数。可选择的是,该函数计算雅各布系数–图像点坐标的偏导矩阵(作为所有输入参数的函数),相对于特定的参数,内在的和/或外在的。在校准相机(calibrateCamera)、解决PnP和立体校准(stereoCalibrate)的全局优化过程中,会用到Jacobian。该函数本身也可以用来计算重投影误差,给定当前的内在和外在参数。
举例:projectPoints(tempPointSet, rvecsMat[i], tvecsMat[i], cameraMatrix, distCoeffs, image_points2);
6,评价误差
CV_EXPORTS_W double norm(InputArray src1, InputArray src2,
int normType = NORM_L2, InputArray mask = noArray());
参数:1,重新计算出来的图像坐标,2,角点读取出来的图像坐标,3,一般选择NORM_L2,4,默认值不用输入 举例:err = norm(image_points2Mat, tempImagePointMat, NORM_L2);
博客参考
1.opencv标定函数解说 双目立体标定源代码(免费拿走不谢) (单/双目)图像标定全流程(C++/Opencv实现)