使用opencv中标定函数calibrateCamera获取相机的内外参数
使用棋盘的目的就是在不知道棋盘像素坐标和对应的三维坐标的前提下通过从不同的角度拍摄的N张像片来获取棋盘点的像素坐标和目标点坐标,从而得到相机的内参数矩阵和旋转平移向量。本实验跳过棋盘标定环节,基于已知的图像像素坐标和三维坐标的基础上进行相机标定,并和已知的相机内参数进行比较,得出差异。
已知图片Left_00003,像素坐标,三维坐标。
相关网址:http://m.blog.csdn.net/blog/ychl87/11473593
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <fstream>
#include <vector>
using namespace cv;
using namespace std;;
int main(int argc, char** argv)
{
//加载影像
Mat view;
view = imread("Left_00003.jpg", 1);
if(view.empty())
{
return -1;
}
//获取影像的大小
Size imagesize = view.size();
//相机标定
cout << "***********开始相机标定***********" << endl << endl;
vector<Point3f>object;
vector<Point2f>image;
vector<vector<Point3f>>objectPoints;
vector<vector<Point2f>>imagePoints;
Mat cameraMatrix;
Mat disCoeffs;
vector<Mat>rvecs;
vector<Mat>tvecs;
//读取像素坐标
fstream inFileimage1;
inFileimage1.open("left00003imagePoints.txt");
int num;
inFileimage1 >> num;
for (int i = 0 ;i < num;i ++)
{
Point2f pt;
inFileimage1 >> pt.x;
inFileimage1 >> pt.y;
image.push_back(pt);
}
//读取对应的三维世界坐标
fstream infileimage2;
infileimage2.open("left00003objectPoints.txt");
infileimage2 >> num;
for (int i = 0 ;i < num;i ++)
{
Point3f pt;
pt.z = 0;
infileimage2 >> pt.x;
infileimage2 >> pt.y;
object.push_back(pt);
}
imagePoints.push_back(image);
objectPoints.push_back(object);
//相机标定
calibrateCamera(objectPoints,imagePoints,imagesize,cameraMatrix,disCoeffs,rvecs,tvecs);
//标定参数输出
cout << "*************相机参数**************" << endl;
cout << cameraMatrix<<endl;
cout << "*************畸变参数**************" << endl;
cout << disCoeffs << endl;
vector<Mat>::iterator it;
for (it =rvecs.begin();it!=rvecs.end();it++)
{
cout << "*************旋转向量**************" << endl;
cout << *it << endl;
}
vector<Mat>::iterator it1;
for (it1 =tvecs.begin();it1!=tvecs.end();it1++)
{
cout << "*************平移向量**************" << endl;
cout << *it1 << endl;
}
return 0;