OPENCV习作之相机标定

4 篇文章 0 订阅
3 篇文章 0 订阅

基于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幅图进行标定,下一期将计算双目标定结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值