快捷搜索: 王者荣耀 脱发

matlab双目标定(详细过程)

具体标定步骤如下:

一、获得棋盘格图像

大多数双目标定都是用棋盘格进行标定,如下所示: 这里有一段c++代码,用于生成棋盘格图像:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;
using namespace std;

void main()
{
	//---生成标定图
	IplImage    *img;
	int chess_size = 500;
	int dx = 10;    //棋盘格大小,像素为单位
	int dy = 7;     //棋盘格数目
	img = cvCreateImage(cvSize(chess_size*dy, chess_size*dx), IPL_DEPTH_8U, 1);
	cvZero(img);
	int flag = 0;
	for (int i = 0; i < dx; i++)
	for (int j = 0; j < dy; j++)
	{
		flag = (i + j) % 2;
		if (flag == 0)
		{
			for (int m = i*chess_size; m < (i + 1)*chess_size; m++)
			for (int n = j*chess_size; n < (j + 1)*chess_size; n++)
				*(img->imageData + m*img->widthStep + n) = 255;
		}
	}
	cvSaveImage("标定图2.jpg", img);
	// 生成的棋盘格图保存在该工程目录下
	cvNamedWindow("cab", 1);
	cvShowImage("cab", img);
	char ch = cv::waitKey(0);
	if (ch == 27)
	{
		exit(0);
	}
	//system("PAUSE");
	//---END生成标定图
}

生成棋盘格后,拿双目相机对棋盘格进行不同位姿的多次拍照采样,一般在20张左右即可。分别将左目和右目的图像存在两个文件夹中。图像如下:

左相机图: 右相机图:

二、matlab标定工具箱

1、打开标定工具箱

在命令行输入stereoCameraCalibrator,出现如下界面: 将上面的“Skew”、“Tangential Distortion”以及“3 Coefficients”等选项选上,将“2 Coefficients”选项去掉,如下:

2、载入图像

点击添加图像出现如下界面:

Camera1代表左摄像头,Camera2代表右摄像头,分别选择存放着左右图像的文件夹,需要特别注意的是棋盘格的边长应该根据打印的实际大小填写,单位可以选择,然后点击OK,程序会自动检测采集的图像到底有多少可以使用,可以说MATLAB2015的这个工具十分挑剔,如果角度不好的话,将使用不了,因此在采集图像时,最好多的采集一些。

3、标定

点击按钮,开始标定: 左下方的直方图为左右图像的标定误差,点击误差较大的直方图,可以直接在左边的图像对中找到对应的图像,右键选择“Remove and Recalibrate”,可以重复上述步骤,直到认为误差满足标定需求为止。

4、导出参数

点击选择Export camera parameters,并点击“OK”。

三、读取参数

标定结束后,会得到如下标定参数: TranslationOfCamera2:相机2相对于相机1的偏移矩阵,可以直接使用。 RotationOfCamera2:相机2相对于相机1的旋转矩阵,需要转置之后才能使用。

CameraParameters1与CameraParameters2为左右摄像头的单独标定参数。CameraParameters1与CameraParameters2中包含如下文件: IntrinsicMatrix存放的是摄像头的内参,只与摄像机的内部结构有关,需要先转置再使用。 RadialDistortion:径向畸变,摄像头由于光学透镜的特性使得成像存在着径向畸变,可由K1,K2,K3确定。 TangentialDistortion:切向畸变,由于装配方面的误差,传感器与光学镜头之间并非完全平行,因此成像存在切向畸变,可由两个参数P1,P2确定。 使用时,需要注意参数的排放顺序,即K1,K2,P1,P2,K3。切记不可弄错,否则后续的立体匹配会出现很大的偏差。

经验分享 程序员 微信小程序 职场和发展