OpenCV3.1.0鱼眼相机标定及畸变校正

       常用的相机模型为针孔模型,此模型在视场较小的情况下是适用的,随着视场的增加,模型误差越来越大。

       普通镜头和鱼眼镜头成像原理的差异是造成此现象的根本原因。具体原理可以参见:

[1] http://docs.opencv.org/master/db/d58/group__calib3d__fisheye.html#gsc.tab=0

[2] Juho Kannalaand Sami S. Brandt. A generic camera model and calibration method for conventional,wide-angle and fish-eye lenses. IEEE Transactions on Pattern Analysis andMachine Intelligence, vol. 28, no. 8, August 2006.

[3] Juho Kannala,Janne Heikkila and Sami S. Brandt. Geometric camera calibration. WileyEncyclopedia of Computer Science and Engineering, 2008.

            

      我的源程序:

      vector<Point2f> img_ptsTemp;
      vector<vector<Point2f>> img_ptsVector;


      vector<Point3f> obj_ptsTemp;
      vector<vector<Point3f>> obj_ptsVector;

       // 鱼眼镜头参数
         Mat intrinsic_mat;            //Matx33d intrinsic_mat亦可;           Mat intrinsic_mat(3, 3, CV_64FC1, Scalar(0))亦可,注意数据类型;      
         Mat distortion_coeffs;     //Vec4d distortion_coeffs亦可

 int flag = 0;
 flag |= cv::fisheye::CALIB_RECOMPUTE_EXTRINSIC;
 flag |= cv::fisheye::CALIB_CHECK_COND;
 flag |= cv::fisheye::CALIB_FIX_SKEW;  /*非常重要*/

           cv::fisheye::calibrate(
                                       obj_ptsVector,
img_ptsVector,
board_img_size,
intrinsic_mat, 
distortion_coeffs,
cv::noArray(),      
cv::noArray(),     
flag,
cv::TermCriteria(3, 20, 1e-6)
);


//畸变校正

void FishEyeImgUndistort()
{
Mat DistortImg = cv::imread("fore_1.jpg");


Mat UndistortImg;   
Mat new_intrinsic_mat;    //Mat new_intrinsic_mat(3, 3, CV_64FC1, Scalar(0))亦可,注意数据类型;


//fx,fy变大(小),视场变小(大),裁剪较多(少),但细节清晰(模糊);很关键,new_intrinsic_mat决定输出的畸变校正图像的范围
intrinsic_mat.copyTo(new_intrinsic_mat);

//调整输出校正图的视场
new_intrinsic_mat.at<double>(0, 0) *= 0.5;      //注意数据类型,非常重要
new_intrinsic_mat.at<double>(1, 1) *= 0.4; 


//调整输出校正图的中心
new_intrinsic_mat.at<double>(0, 2) += 0.0;   
new_intrinsic_mat.at<double>(1, 2) += 0.0;


cv::fisheye::undistortImage(
DistortImg,
UndistortImg,
intrinsic_mat,
distortion_coeffs,
new_intrinsic_mat    //
);      //最后一个camera_matrix必须写上  Ref:http://answers.opencv.org/question/64614/fisheyeundistortimage-doesnt-work-what-wrong-with-my-code/


cv::imshow("DistortImg", DistortImg);
cv::imshow("UndistortImg", UndistortImg);
cv::imwrite("feModelUndistortFore.jpg", UndistortImg);
cv::waitKey(0);
}








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值