靠谱的opencv摄像头畸变标定

我们用opencv的例程来进行标定,在你的opencv目录下
sources\samples\cpp\tutorial_code\calib3d\camera_calibration
有3个文件 :

camera_calibration.cpp
VID5.xml
in_VID5.xml

第一个是标定程序的源代码。
第二个是配置文件,你可以更改标定图片获取的方式以及标定板的一些参数。
第三个里面可以修改标定图片序列的文件名。

前提准备:
标定板。这里我制作好了一个,按照原比例打印出来,然后固定在一个硬板子上。
靠谱的opencv摄像头畸变标定_第1张图片

接下来就可以开始了……
我们这里只介绍从摄像头获取标定图片的方式。其他方式可以按照说明更改VID5.xml自行实现。

第一步,新建一个工程,将camera_calibration.cpp文件的源码拷贝进去。
第二步,将VID5.xml拷贝到工程目录下面。
第三步,编辑VID5.xml,将Input标签里的内容改为待标定相机的ID,我的是”1”,记得加上引号。
第四步,编译并运行程序。 “

下面是我的VID5.xml文件


<opencv_storage>
<Settings>
  
  <BoardSize_Width> 9BoardSize_Width>
  <BoardSize_Height>6BoardSize_Height>

  
  <Square_Size>50Square_Size>

  
  <Calibrate_Pattern>"CHESSBOARD"Calibrate_Pattern>

  
  <Input>"1"Input>
  
  <Input_FlipAroundHorizontalAxis>0Input_FlipAroundHorizontalAxis>

  
  <Input_Delay>100Input_Delay>    

  
  <Calibrate_NrOfFrameToUse>25Calibrate_NrOfFrameToUse>
  
  <Calibrate_FixAspectRatio> 1 Calibrate_FixAspectRatio>
  
  <Calibrate_AssumeZeroTangentialDistortion>1Calibrate_AssumeZeroTangentialDistortion>
  
  <Calibrate_FixPrincipalPointAtTheCenter> 1 Calibrate_FixPrincipalPointAtTheCenter>

  
  <Write_outputFileName>"out_camera_data.xml"Write_outputFileName>
  
  <Write_DetectedFeaturePoints>1Write_DetectedFeaturePoints>
  
  <Write_extrinsicParameters>1Write_extrinsicParameters>
  
  <Show_UndistortedImage>1Show_UndistortedImage>

Settings>
opencv_storage>

标定结果:
靠谱的opencv摄像头畸变标定_第2张图片
靠谱的opencv摄像头畸变标定_第3张图片

前后的差异可以看清了吧

值得一提的是工程目录下生成了一个out_camera_data.xml文件,里面记录摄像头标定的一些参数,以后可以直接使用。我们用它略去标定的步骤,直接校正摄像机,这样标定好一次就可以一直使用了。
将生成的out_camera_data.xml放到你的工程目录下就可以使用了。
下面是一个简单的调用摄像头并用已有的参数进行标定的程序,可以直接使用。

#include 
#include 
using namespace std;
using namespace cv;
int main(){
    VideoCapture capture;
    capture.open(1);
    while (1){
        Mat frame;
        capture.read(frame);
        Mat undistort_frame = frame.clone();
        Mat camera_matrix = Mat(3, 3, CV_32FC1);
        Mat distortion_coefficients;


        //导入相机内参和畸变系数矩阵
        FileStorage file_storage("out_camera_data.xml", FileStorage::READ);
        file_storage["Camera_Matrix"] >> camera_matrix;
        file_storage["Distortion_Coefficients"] >> distortion_coefficients;
        file_storage.release();

        //矫正
        undistort(frame, undistort_frame, camera_matrix, distortion_coefficients);

        imshow("img", frame);
        imshow("undistort", undistort_frame);

        char c = waitKey(1);
        if (c == 'q' || c == 27) {
            return 0;
        }
        else if (c == ' '){
            waitKey();
        }
    }
}

你可能感兴趣的:(计算机视觉,opencv)