#include "OpencvChessboardCalibration.h"
using namespace cv;
using namespace std;
OpencvChessboardCalibration :: OpencvChessboardCalibration()
{
imageSize.width = 0;
imageSize.height = 0;
nframes = 0;
nValidFrames = 0;
rowCornersNum = 0;
colCornersNum = 0;
squareSize = 0.0f;
nflags = 0;
aspectRatio = 1.0f;
bIsWriteExtrinsics = true;
bIsWritePoints = true;
}
OpencvChessboardCalibration :: ~OpencvChessboardCalibration()
{
}
bool OpencvChessboardCalibration :: writeStringList( const string& fileList, const string& prefixFileName,int nframes )
{
stringstream ss;
string strFileNum;
string fileName = prefixFileName;
FileStorage fs(fileList,FileStorage::WRITE);
if( !fs.isOpened() )
{
return false;
}
fs << "fileList" << "[";
for( int i=1; i <= nframes; i++ )
{
ss.clear();
ss << i;
ss >> strFileNum;
fileName = prefixFileName;
fileName += strFileNum;
fileName += ").";
fileName += this->imageFormatName;
fs << fileName ;
}
fs << "]";
fs.release();
return true;
}
bool OpencvChessboardCalibration :: readStringList( const string& filename, vector<string>& fileList )
{
fileList.resize(0);
FileStorage fs(filename, FileStorage::READ);
if( !fs.isOpened() )
{
return false;
}
FileNode n = fs.getFirstTopLevelNode();
if( n.type() != FileNode::SEQ )
{
return false;
}
FileNodeIterator it = n.begin(), it_end = n.end();
for( ; it != it_end; ++it )
{
fileList.push_back((string)*it);
}
return true;
}
void OpencvChessboardCalibration :: calcChessboardCorners(Size boardSize, float squareSize, vector<Point3f>& corners)
{
corners.resize(0);
for( int i = 0; i < boardSize.height; i++ )
{
for( int j = 0; j < boardSize.width; j++ )
{
corners.push_back( Point3f( float(j*squareSize),float(i*squareSize), 0 ) );
}
}
}
bool OpencvChessboardCalibration :: runCalibration( vector<vector<Point2f> > imagePoints,
Size imageSize, Size boardSize,
float squareSize, float aspectRatio,
int flags, Mat& cameraMatrix, Mat& distCoeffs,
vector<Mat>& rvecs, vector<Mat>& tvecs,
vector<float>& reprojErrs,
double& totalAvgErr)
{
cameraMatrix = Mat::eye(3, 3, CV_64F);
if( flags & CV_CALIB_FIX_ASPECT_RATIO )
{
cameraMatrix.at<double>(0,0) = aspectRatio;
}
distCoeffs = Mat::zeros(8, 1, CV_64F);
vector<vector<Point3f> > objectPoints(1);
calcChessboardCorners(boardSize, squareSize, objectPoints[0]);
objectPoints.resize(imagePoints.size(),objectPoints[0]);
double rms = calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix,
distCoeffs, rvecs, tvecs, flags|CV_CALIB_FIX_K4|CV_CALIB_FIX_K5);
///*|CV_CALIB_FIX_K3*/|CV_CALIB_FIX_K4|CV_CALIB_FIX_K5);
//printf("RMS error reported by calibrateCamera: %g\n", rms);
bool ok = checkRange(cameraMatrix) && checkRange(distCoeffs);
totalAvgErr = computeReprojectionErrors( objectPoints, imagePoints,
rvecs, tvecs, cameraMatrix, distCoeffs, reprojErrs);
return ok;
}
void OpencvChessboardCalibration :: saveCameraParams( const string& filename,
Size imageSize, Size boardSize,
float squareSize, float aspectRatio, int flags,
const Mat& cameraMatrix, const Mat& distCoeffs,
const vector<Mat>& rvecs, const vector<Mat>& tvecs,
const vector<float>& reprojErrs,
const vector<vector<Point2f> >& imagePoints,
double totalAvgErr )
{
FileStorage fs( filename, FileStorage::WRITE );
time_t tt;
time( &tt );
struct tm *t2 = localtime( &tt );
char buf[1024];
strftime( buf, sizeof(buf)-1, "%c", t2 );
fs << "calibration_time" << buf;
if( !rvecs.empty() || !reprojErrs.empty() )
fs << "nframes" << (int)std::max(rvecs.size(), reprojErrs.size());
fs << "image_width" << imageSize.width;
fs << "image_height" << imageSize.height;
fs << "board_width" << boardSize.width;
fs << "board_height" << boardSize.height;
fs << "square_size" << squareSize;
if( flags & CV_CALIB_FIX_ASPECT_RATIO )
fs << "aspectRatio" << aspectRatio;
if( flags != 0 )
{
sprintf( buf, "flags: %s%s%s%s",
flags & CV_CALIB_USE_INTRINSIC_GUESS ? "+use_intrinsic_guess" : "",
flags & CV_CALIB_FIX_ASPECT_RATIO ? "+fix_aspectRatio" : "",
flags & CV_CALIB_FIX_PRINCIPAL_POINT ? "+fix_principal_point" : "",
flags & CV_CALIB_ZERO_TANGENT_DIST ? "+zero_tangent_dist" : "" );
cvWriteComment( *fs, buf, 0 );
}
fs << "flags" << flags;
fs << "camera_matrix" << cameraMatrix;
fs << "distortion_coefficients" << distCoeffs;
fs << "avg_reprojection_error" << totalAvgErr;
if( !reprojErrs.empty() )
fs << "per_view_reprojection_errors" << Mat(reprojErrs);
if( !rvecs.empty() && !tvecs.empty() )
{
CV_Assert(rvecs[0].type() == tvecs[0].type());
Mat bigmat((int)rvecs.size(), 6, rvecs[0].type());
for( int i = 0; i < (int)rvecs.size(); i++ )
{
Mat r = bigmat(Range(i, i+1), Range(0,3));
Mat t = bigmat(Range(i, i+1), Range(3,6));
CV_Assert(rvecs[i].rows == 3 && rvecs[i].cols == 1);
CV_Assert(tvecs[i].rows == 3 && tvecs[i].cols == 1);
//*.t() is MatExpr (not Mat) so we can use assignment operator
r = rvecs[i].t();
t = tvecs[i].t();
}
cvWriteComment( *fs, "a set of 6-tuples (rotation vector + translation vector) for each view", 0 );
fs << "extrinsic_parameters" << bigmat;
}
if( !imagePoints.empty() )
{
Mat imagePtMat((int)imagePoints.size(), (int)imagePoints[0].size(), CV_32FC2);
for( int i = 0; i < (int)imagePoints.size(); i++ )
{
Mat r = imagePtMat.row(i).reshape(2, imagePtMat.cols);
Mat imgpti(imagePoints[i]);
imgpti.copyTo(r);
}
fs << "image_points" << imagePtMat;
}
}
double OpencvChessboardCalibration :: computeReprojectionErrors(
const vector<vector<Point3f> >& objectPoints,
const vector<vector<Point2f> >& imagePoints,
const vector<Mat>& rvecs, const vector<Mat>& tvecs,
const Mat& cameraMatrix, const Mat& distCoeffs,
vector<float>& perViewErrors )
{
vector<Point2f> imagePoints2;
int i, totalPoints = 0;
double totalErr = 0, err;
perViewErrors.resize(objectPoints.size());
for( i = 0; i < (int)objectPoints.size(); i++ )
{
projectPoints(Mat(objectPoints[i]), rvecs[i], tvecs[i],
cameraMatrix, distCoeffs, imagePoints2);
err = norm(Mat(imagePoints[i]), Mat(imagePoints2), CV_L2);
int n = (int)objectPoints[i].size();
perViewErrors[i] = (float)std::sqrt(err*err/n);
totalErr += err*err;
totalPoints += n;
}
return std::sqrt(totalErr/totalPoints);
}
bool OpencvChessboardCalibration :: runAndSave(const string& outputFilename,
const vector<vector<Point2f> >& imagePoints,
Size imageSize, Size boardSize, float squareSize,
float aspectRatio, int flags, Mat& cameraMatrix,
Mat& distCoeffs, double& avgReprojectError,bool writeExtrinsics, bool writePoints )
{
vector<Mat> rvecs, tvecs;
vector<float> reprojErrs;
bool ok = runCalibration( imagePoints, imageSize, boardSize, squareSize,
aspectRatio, flags, cameraMatrix, distCoeffs,
rvecs
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
OpenCV棋盘格相机标定控制台程序_20161128.rar (68个子文件)
cameraCalibration
ipch
cameracalibration-e22de555
cameracalibration-2dbc155d.ipch 45.63MB
cameraCalibration.suo 17KB
Debug
cameraCalibration.exe 261KB
cameraCalibration.ilk 1.06MB
cameraCalibration.pdb 2.8MB
cameraCalibration.sdf 16.46MB
cameraCalibration.sln 918B
cameraCalibration
image (10).jpg 27KB
cameraCalibration.vcxproj.filters 1KB
image (8).jpg 29KB
image (4).jpg 29KB
OpencvChessboardCalibration.h 4KB
image (11).jpg 27KB
image (1).jpg 27KB
image (3).jpg 28KB
Debug
CL.write.1.tlog 1KB
vc100.idb 515KB
mt.read.1.tlog 406B
link.4792.read.1.tlog 2B
cameraCalibration.exe.embed.manifest 406B
link.4792-cvtres.write.1.tlog 2B
link.12240.write.1.tlog 2B
cameraCalibration.write.1.tlog 0B
cameraCalibration.lastbuildstate 84B
link.9876-cvtres.read.1.tlog 2B
link-cvtres.write.1.tlog 2B
link.9876.read.1.tlog 2B
cameraCalibration.Build.CppClean.log 3KB
rc.command.1.tlog 676B
cameraCalibration_manifest.rc 224B
cameraCalibration.exe.embed.manifest.res 472B
link.command.1.tlog 3KB
vc100.pdb 692KB
CL.read.1.tlog 31KB
mt.write.1.tlog 406B
link-cvtres.read.1.tlog 2B
link.4792.write.1.tlog 2B
link.12240-cvtres.read.1.tlog 2B
rc.read.1.tlog 378B
cameraCalibration.log 3KB
link.9876.write.1.tlog 2B
cameraCalibration.vcxprojResolveAssemblyReference.cache 713B
OpencvChessboardCalibration.obj 1.29MB
mt.command.1.tlog 468B
link.write.1.tlog 1KB
cameraCalibration.exe.intermediate.manifest 381B
link.12240-cvtres.write.1.tlog 2B
link.12240.read.1.tlog 2B
link.4792-cvtres.read.1.tlog 2B
cl.command.1.tlog 1KB
main.obj 126KB
link.9876-cvtres.write.1.tlog 2B
rc.write.1.tlog 386B
link.read.1.tlog 6KB
calibrationDetails.yml 30KB
cameraCalibration.vcxproj.user 143B
OpencvChessboardCalibration.cpp 14KB
image (9).jpg 28KB
main.cpp 2KB
cameraCalibration.vcxproj 5KB
image (2).jpg 27KB
image (6).jpg 28KB
calibration.cpp 14KB
image (12).jpg 25KB
image (7).jpg 28KB
imagesNameList.yml 312B
image (13).jpg 27KB
image (5).jpg 25KB
共 68 条
- 1
资源评论
- 清妮2018-10-10没有运行起来,可能是自己没有配置好文件吧,准备再下载一次试试看
一天到晚游泳的鱼啊鱼
- 粉丝: 109
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功