资讯详情

opencv标定函数解说

opencv解释标定函数

  • 1找标定板的角点
  • 2.角点亚像素化
  • 3.画出角点,用线连接
  • 4,标定图片
  • 5.对点重投影获得新的世界坐标
  • 6,评价误差
  • 博客参考
以下一系列函数是opencv一系列校准的基本函数,还有一些其他操作可以看到我之前的文章有完整的代码

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实现)

标签: 310激光传感器nx

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台