双目相机标定流程(使用opencv采集图像、使用matlab标定相机参数)

一、使用opencv采集双目图像

1.准备标准棋盘并打印

这里我们使用OpenCV提供的sample程序中的标定图片,图片位于opencv(C++版本)的安装路径:opencv\sources\samples\data下。使用打印机打印图片,注意不要选择适应边框,直接原大小打印,这样每一个小方格子的边长就是26mm(实际测量)

2.摄像头采集双目图像并且保存

标定图片需要使用标定板在不同位置、不同角度、不同姿态下拍摄,以10~20张为宜。标定板需要是黑白相间的矩形构成的棋盘图,制作精度要求较高。下面代码是使用opencv读取双目照片,进行分割之后将左右相机的的照片分别保存道相应的文件夹下。用户在使用的时候只需要修改文件夹放置的位置即可。按C键采集一次图片

#include <unistd.h>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <fstream>
#include <cstdio>

using namespace cv;
using namespace std;

#define WIDTH 2560
#define HEIGHT 720
int main() 
{
	char c = 0;
    VideoCapture capture(0);
    Mat cam;
    int i = 0;
    if (!capture.isOpened())
    {
        cout<<"can not open the camera"<<endl; cin.get(); exit(1);
    }
    capture.set(CAP_PROP_FRAME_WIDTH, WIDTH);
    capture.set(CAP_PROP_FRAME_HEIGHT, HEIGHT);
	string pathNameLeft = "/media/nvidia/34EE-34E53/SavedImages/Left/Left";
	string pathNameRight = "/media/nvidia/34EE-34E53/SavedImages/Right/Right";
	string formatName = ".jpg";
	string num;
	string fileNameL;
	string fileNameR;

	while (capture.read(cam))   //循环读取摄像画面帧capture >> cam
    {
        int w, h ;
        w= cam.cols;  //获取相机画面宽高
        h= cam.rows;      
        imshow("cam",cam);        
        Rect rect0(0, 0, w/2, h); //(x,y,width,height)定义矩形框截取
        Mat caml = cam(rect0); //截取左摄像头画面
        Rect rect1(w/2, 0, w/2, h);
        Mat camr = cam(rect1); //截取右半边

        c = waitKey(10);
        if(c == 'c') //按c键采集图像
        {
			num = to_string(i);
            fileNameL = pathNameLeft + num + formatName;
			fileNameR = pathNameRight + num + formatName;
            imwrite(fileNameL, caml);
            imwrite(fileNameR, camr);
			++i;
            cout<<"capture ok!"<<endl; //每次截取成功打印一次,图片保存在工程的编译目录下
        }
        c = waitKey(10);
        if (c == 'q')//按q键退出 ,27为Esc键
        {
             break;
        }
    }
	return 0;

}

二、使用matlab2018标定相机参数

 

1.内参

IntrinsicMatrix对应内参,注意这个和OpenCV中是转置的关系,注意不要搞错。 

2.畸变参数

RadialDistortion:径向畸变,摄像头由于光学透镜的特性使得成像存在着径向畸变,可由K1,K2,K3确定。

这里写图片描述

NOTE:

  • matlab选择3 Coefficients,则是K1,K2,K3三个参数非线性拟合;畸变不严重的情况下可以选择2 Coefficients,这样径向畸变就由K1,K2确定,K3为0。
  • 对于畸变较小的图像中心区域,主要是k1起作用;对于畸变较大的边缘区域主要是k2起作用。普通相机这两个系数就够用了,对于鱼眼相机这种畸变特别大的才用的上第三个参数k3  

TangentialDistortion:切向畸变,由于装配方面的误差,传感器与光学镜头之间并非完全平行,因此成像存在切向畸变,可由两个参数P1,P2确定。

这里写图片描述

opencv使用时,需要注意参数的排放顺序,即K1K2P1P2K3。千万不要以为k是连着的。 

这里写图片描述

 

 

ref:

https://blog.csdn.net/ktigerhero3/article/details/83039964

https://blog.csdn.net/moonshapedpool/article/details/83105526

https://blog.csdn.net/yanli33/article/details/60478023

https://blog.csdn.net/Loser__Wang/article/details/51811347

http://www.cnblogs.com/chay/p/7551151.html

https://www.cnblogs.com/voyagee/p/7524946.html

  • 0
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值