基于opencv2.4.4,从今天起分享我的学习实践成长路径,废话不多说,上代码
// TestCamera1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char spath[]="C:\\Users\\WeiZhe\\Documents\\360摄像头\\照片\\201606211044369.jpg";
Mat Im_src=imread(spath,CV_LOAD_IMAGE_GRAYSCALE);
namedWindow("Src");
imshow("Src",Im_src);
waitKey();
Size boardsize(9,6);
vector<vector<Point3f>> Objectpoint; // 世界坐标系
vector<vector<Point2f>> Imagepoint_l; // 像素坐标系
vector<vector<Point2f>> Imagepoint_r;
vector<Point3f> Objcorner; // 世界坐标系
vector<Point2f> Imgcorner; // 像素坐标系
int i,j;
// 检测角点(试验)
bool findresult=findChessboardCorners(Im_src, boardsize, Imgcorner, CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_NORMALIZE_IMAGE);
if(findresult)
{
cornerSubPix(Im_src, Imgcorner, Size(11, 11), Size(-1, -1),TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
drawChessboardCorners(Im_src, boardsize, Mat(Imgcorner), findresult);
cout<<Imgcorner<<endl;
namedWindow("Dst");
imshow("Dst",Im_src);
waitKey();
}
else
{
cout<<"Failed!"<<endl;
return -1;
}
// 检测角点(文件列表)
// 左图
std::vector<std::string> filelist;
char str[100];
Imgcorner.swap(vector<Point2f>()); // 清空原内容
for(i=1;i<=14;i++) // 列表赋值
{
if(i==10)
continue;
sprintf(str,"D:\\Soft\\OpenCV-2.4.4\\samples\\cpp\\left%02d.jpg",i);
filelist.push_back(str);
}
// 打开、检测
for(i=0;i<boardsize.width;i++)
for(j=0;j<boardsize.height;j++)
Objcorner.push_back(Point3f(i,j,0.0));
for(i=0;i<filelist.size();i++)
{
Im_src=imread(filelist[i],0);
findresult=findChessboardCorners(Im_src,boardsize,Imgcorner);
cornerSubPix(Im_src, Imgcorner, Size(11, 11), Size(-1, -1),TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
if(Imgcorner.size()==boardsize.area()) // 若检测到的点数吻合,添加到列表中。
{
cout<<filelist[i]<<" succeed!"<<endl;
Objectpoint.push_back(Objcorner);
Imagepoint_l.push_back(Imgcorner);
}
}
// 标定参数
Mat cameraMatrix; // 相机矩阵
Mat distCoeffs; // 畸变矩阵
vector<Mat> rvecs,tvecs; // 旋转和平移
calibrateCamera(Objectpoint,Imagepoint_l,Im_src.size(),cameraMatrix,distCoeffs,rvecs,tvecs);
cout<<"cameraMatrix:"<<endl<<cameraMatrix<<endl;
cout<<"distCoeffs:"<<endl<<distCoeffs<<endl;
for(i=0;i<rvecs.size();i++)
cout<<"rvecs:"<<endl<<rvecs[i]<<endl;
for(i=0;i<tvecs.size();i++)
cout<<"tvecs:"<<endl<<tvecs[i]<<endl;
// 矫正畸变
Mat undist,map1,map2;
initUndistortRectifyMap(cameraMatrix,distCoeffs,Mat(),Mat(),Im_src.size(),CV_32FC1,map1,map2);
remap(Im_src,undist,map1,map2,INTER_LINEAR);
imshow("Undistort_l",undist); // 显示矫正的图像
waitKey();
// 右图
for(i=1;i<=14;i++) // 列表赋值
{
if(i==10)
continue;
sprintf(str,"D:\\Soft\\OpenCV-2.4.4\\samples\\cpp\\right%02d.jpg",i);
Im_src=imread(str,0);
findresult=findChessboardCorners(Im_src,boardsize,Imgcorner);
cornerSubPix(Im_src, Imgcorner, Size(11, 11), Size(-1, -1),TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
if(Imgcorner.size()==boardsize.area()) // 若检测到的点数吻合,添加到列表中。
{
cout<<str<<" succeed!"<<endl;
Imagepoint_r.push_back(Imgcorner);
}
}
rvecs.swap(vector<Mat>());
tvecs.swap(vector<Mat>());
calibrateCamera(Objectpoint,Imagepoint_r,Im_src.size(),cameraMatrix,distCoeffs,rvecs,tvecs);
cout<<"cameraMatrix:"<<endl<<cameraMatrix<<endl;
cout<<"distCoeffs:"<<endl<<distCoeffs<<endl;
for(i=0;i<rvecs.size();i++)
cout<<"rvecs:"<<endl<<rvecs[i]<<endl;
for(i=0;i<tvecs.size();i++)
cout<<"tvecs:"<<endl<<tvecs[i]<<endl;
initUndistortRectifyMap(cameraMatrix,distCoeffs,Mat(),Mat(),Im_src.size(),CV_32FC1,map1,map2);
remap(Im_src,undist,map1,map2,INTER_LINEAR);
imshow("Undistort_r",undist); // 显示矫正的图像
waitKey();
return 0;
}
开始是试验,然后用自带的例子里13幅图进行标定,下一期将计算双目标定结果。