opencv的calibrateCamera标定结果在畸变校正时出现的问题

    用opencv自带的或其它许多标定程序算出内参和畸变系数,用这些标定参数作畸变校正时可能会发现图像严重扭曲,非常有意思。我们知道Matlab有一个标定工具箱,可以用这个工具箱求标定参数,可以发现Matlab的标定结果与opencv程序的标定结果出入好大,Matlab的能正确校正出图像而opencv的不能。如何才能用opencv程序标定出满意的参数呢?可以设置calibrateCamera函数使畸变系数k3=0,如下:

double rms = calibrateCamera(objectPoints, imagePoints,
		imageSize, cameraMatrix, distCoeffs, rvecs,
		tvecs, CV_CALIB_FIX_K3);

这时求出的结果与Matlab求的差不多。

calibrateCamera函数解释如下……

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

<span style="font-size: 18px;">double calibrateCamera(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints,Size imageSize, InputOutputArray cameraMatrix, InputOutputArray distCoeffs, OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, int flags=0)</span>

其中

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个畸变参数。




  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenCVSharp是一个针对C#语言的开源计算机视觉库,它是由OpenCV(Aperio Vero)的C++版本转化而来,可以提供人脸识别、图像处理和目标跟踪等计算机视觉功能。在OpenCVSharp中,相机标定畸变校正是非常重要的计算机视觉基础工作,通过标定相机,可以减小图像的畸变误差,从而更好地进行计算机视觉目标检测和识别。 首先,我们需要准备标定板,标定板是指各种规则的有固定大小、特征点确定、符合相机成像原理,用于相机标定畸变校正标定板,标定板应摆放在不同的角度,以便获取多角度的照片,以确保标定参数的准确性。 其次,在OpenCVSharp中,我们需要调用cv::findChessboardCorners函数实现对标定板的检测,其可以根据标定板的简单几何结构,自动检测出对应的标定板角点坐标信息,同通过调用cv::calibrateCamera函数,来进行相机的自动标定。通过标定得到的内参矩阵、畸变矩阵和转换矩阵可以对相机进行畸变校正。 当畸变校正完成后,我们可以通过OpenCVSharp提供的函数cv::undistort实现畸变校正。这个函数接受原始图像、内参矩阵和畸变矩阵作为输入,返回畸变校正后的图像。最后,我们还需要将标定结果保存在一个XML文件中,以供后续使用。 读取标定结果,我们可以使用OpenCVSharp提供的cv::FileStorage类来读取保存在XML文件中的参数。然后,我们可以将这些参数应用于相机校正和目标检测等相关计算机视觉应用中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值