#include "stdafx.h"
DECLAREGLOBAL
int ZHANGZHENGYOUBIAODING(const char* chessdir)
{
int CurrentImage = 0;
int CurrentRow = 0; //行
int CurrentColumn = 0; //列
int ChessBoardSize_w = 8; //角点个数
int ChessBoardSize_h = 6;
bool findcorner_result = false;
float SquareSize=10;//方格大小
Mat src;
Mat gray;
Mat cameraMatrix; //intrinsic
Mat distCoeffs;
vector<Mat> rvecs,tvecs;
Mat rmatrix,tmatrix;
vector<Point2f> imageCorners;//存储角点
vector<vector<Point2f>> imagePoints;
vector<vector<Point3f>> worldPoints;
vector<CString> imageArray;
GetDirFiles(chessdir,imageArray);
int NImages=imageArray.size();
//读取图片
for(CurrentImage;CurrentImage<NImages;++CurrentImage)
{
src = imread((LPCTSTR)imageArray[CurrentImage]);
//灰
cvtColor(src,gray,CV_BGR2GRAY);
//检测角点
imageCorners.clear();
findcorner_result = findChessboardCorners(gray,Size(ChessBoardSize_w,ChessBoardSize_h),imageCorners,3);
if(!findcorner_result){
DLGPRINT("%s error findChessboardCorners",(LPCTSTR)imageArray[CurrentImage]);
}else{
DLGPRINT("%s OK findChessboardCorners",(LPCTSTR)imageArray[CurrentImage]);
}
//精确坐标
cornerSubPix(gray,imageCorners,Size(10,10),Size(-1,-1),TermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,500,0.003));
imagePoints.push_back(imageCorners);
//画角点
//drawChessboardCorners(src,Size(ChessBoardSize_w,ChessBoardSize_h),imageCorners,findcorner_result);
// imshow("Chess",src);
//DLGPRINT("print any key to read the next pic");
// waitKey();
}
DLGPRINT("开始定标");
vector<Point3f> objectsCorners;
//世界坐标系坐标
for(CurrentImage=0;CurrentImage<NImages;CurrentImage++)
{
for(CurrentRow=0;CurrentRow<ChessBoardSize_h;CurrentRow++)
for(CurrentColumn=0;CurrentColumn<ChessBoardSize_w;CurrentColumn++)
objectsCorners.push_back(Point3f(CurrentRow*SquareSize,CurrentColumn*SquareSize,0.0));
worldPoints.push_back(objectsCorners);
objectsCorners.clear();
}
calibrateCamera(worldPoints,imagePoints,Size(ChessBoardSize_w,ChessBoardSize_h),cameraMatrix,distCoeffs,rvecs,tvecs,0);
std::cout<<cameraMatrix<<std::endl;
std::cout<<distCoeffs<<std::endl;
for(int i=0;i<NImages;++i)
{
//std::cout<<"第"<<i<<"个图片的旋转向量"<<std::endl;
//std::cout<<rvecs[i]<<std::endl;
std::cout<<"第"<<i+1<<"个图片的旋转矩阵"<<std::endl;
Rodrigues(rvecs[i],rmatrix);
std::cout<<rmatrix<<std::endl;
std::cout<<"第"<<i+1<<"个图片的平移向量"<<std::endl;
std::cout<<tvecs[i]<<std::endl;
//开始误差分析
double err = 0.0;
vector<Point2f>undistortMatrix;
projectPoints(worldPoints[i],rmatrix,tvecs[i],cameraMatrix,distCoeffs,undistortMatrix);
err = norm(undistortMatrix,imagePoints[i]);
std::cout<<"第"<<i+1<<"张图的误差为:"<<err<<std::endl;
}
//显示校正后的图片
Mat result_image;
namedWindow("Undistort_image",0);
for(CurrentImage=0;CurrentImage<NImages;CurrentImage++)
{
Mat srcimage = imread((LPCTSTR)imageArray[CurrentImage]);
undistort(srcimage,result_image,cameraMatrix,distCoeffs);
imshow("Undistort_image",result_image);
DLGPRINT("按任意键显示下一幅图片。。。");
waitKey(0);
}
return (0);
DECLAREGLOBAL
int ZHANGZHENGYOUBIAODING(const char* chessdir)
{
int CurrentImage = 0;
int CurrentRow = 0; //行
int CurrentColumn = 0; //列
int ChessBoardSize_w = 8; //角点个数
int ChessBoardSize_h = 6;
bool findcorner_result = false;
float SquareSize=10;//方格大小
Mat src;
Mat gray;
Mat cameraMatrix; //intrinsic
Mat distCoeffs;
vector<Mat> rvecs,tvecs;
Mat rmatrix,tmatrix;
vector<Point2f> imageCorners;//存储角点
vector<vector<Point2f>> imagePoints;
vector<vector<Point3f>> worldPoints;
vector<CString> imageArray;
GetDirFiles(chessdir,imageArray);
int NImages=imageArray.size();
//读取图片
for(CurrentImage;CurrentImage<NImages;++CurrentImage)
{
src = imread((LPCTSTR)imageArray[CurrentImage]);
//灰
cvtColor(src,gray,CV_BGR2GRAY);
//检测角点
imageCorners.clear();
findcorner_result = findChessboardCorners(gray,Size(ChessBoardSize_w,ChessBoardSize_h),imageCorners,3);
if(!findcorner_result){
DLGPRINT("%s error findChessboardCorners",(LPCTSTR)imageArray[CurrentImage]);
}else{
DLGPRINT("%s OK findChessboardCorners",(LPCTSTR)imageArray[CurrentImage]);
}
//精确坐标
cornerSubPix(gray,imageCorners,Size(10,10),Size(-1,-1),TermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,500,0.003));
imagePoints.push_back(imageCorners);
//画角点
//drawChessboardCorners(src,Size(ChessBoardSize_w,ChessBoardSize_h),imageCorners,findcorner_result);
// imshow("Chess",src);
//DLGPRINT("print any key to read the next pic");
// waitKey();
}
DLGPRINT("开始定标");
vector<Point3f> objectsCorners;
//世界坐标系坐标
for(CurrentImage=0;CurrentImage<NImages;CurrentImage++)
{
for(CurrentRow=0;CurrentRow<ChessBoardSize_h;CurrentRow++)
for(CurrentColumn=0;CurrentColumn<ChessBoardSize_w;CurrentColumn++)
objectsCorners.push_back(Point3f(CurrentRow*SquareSize,CurrentColumn*SquareSize,0.0));
worldPoints.push_back(objectsCorners);
objectsCorners.clear();
}
calibrateCamera(worldPoints,imagePoints,Size(ChessBoardSize_w,ChessBoardSize_h),cameraMatrix,distCoeffs,rvecs,tvecs,0);
std::cout<<cameraMatrix<<std::endl;
std::cout<<distCoeffs<<std::endl;
for(int i=0;i<NImages;++i)
{
//std::cout<<"第"<<i<<"个图片的旋转向量"<<std::endl;
//std::cout<<rvecs[i]<<std::endl;
std::cout<<"第"<<i+1<<"个图片的旋转矩阵"<<std::endl;
Rodrigues(rvecs[i],rmatrix);
std::cout<<rmatrix<<std::endl;
std::cout<<"第"<<i+1<<"个图片的平移向量"<<std::endl;
std::cout<<tvecs[i]<<std::endl;
//开始误差分析
double err = 0.0;
vector<Point2f>undistortMatrix;
projectPoints(worldPoints[i],rmatrix,tvecs[i],cameraMatrix,distCoeffs,undistortMatrix);
err = norm(undistortMatrix,imagePoints[i]);
std::cout<<"第"<<i+1<<"张图的误差为:"<<err<<std::endl;
}
//显示校正后的图片
Mat result_image;
namedWindow("Undistort_image",0);
for(CurrentImage=0;CurrentImage<NImages;CurrentImage++)
{
Mat srcimage = imread((LPCTSTR)imageArray[CurrentImage]);
undistort(srcimage,result_image,cameraMatrix,distCoeffs);
imshow("Undistort_image",result_image);
DLGPRINT("按任意键显示下一幅图片。。。");
waitKey(0);
}
return (0);
}
C:\img\chess\left02.jpg OK findChessboardCorners
C:\img\chess\left04.jpg OK findChessboardCorners
C:\img\chess\left05.jpg OK findChessboardCorners
C:\img\chess\left07.jpg OK findChessboardCorners
C:\img\chess\left09.jpg OK findChessboardCorners
C:\img\chess\left11.jpg OK findChessboardCorners
C:\img\chess\left12.jpg OK findChessboardCorners
C:\img\chess\left13.jpg OK findChessboardCorners
C:\img\chess\left14.jpg OK findChessboardCorners
C:\img\chess\right01.jpg OK findChessboardCorners
C:\img\chess\right02.jpg OK findChessboardCorners
C:\img\chess\right03.jpg OK findChessboardCorners
C:\img\chess\right04.jpg OK findChessboardCorners
C:\img\chess\right05.jpg OK findChessboardCorners
C:\img\chess\right06.jpg OK findChessboardCorners
C:\img\chess\right07.jpg OK findChessboardCorners
C:\img\chess\right09.jpg OK findChessboardCorners
C:\img\chess\right11.jpg OK findChessboardCorners
C:\img\chess\right12.jpg OK findChessboardCorners
C:\img\chess\right13.jpg OK findChessboardCorners
C:\img\chess\right14.jpg OK findChessboardCorners
开始定标
-------------------mat--------------------------
535.678894 0.000000 332.888672
0.000000 535.432617 242.006912
0.000000 0.000000 1.000000
----------------mat end--------------------
-------------------mat--------------------------
-0.300526 0.149802 0.000052 -0.000560 -0.063199
----------------mat end--------------------
RVECS
-------------------mat--------------------------
-2.408767
-0.198662
0.216968
----------------mat end--------------------
-------------------mat--------------------------
-2.127419
-2.128250
0.384843
----------------mat end--------------------
-------------------mat--------------------------
-0.332933
-2.935428
0.701011
----------------mat end--------------------
-------------------mat--------------------------
2.971486
0.482567
-0.509134
----------------mat end--------------------
-------------------mat--------------------------
1.932370
2.203017
0.659829
----------------mat end--------------------
-------------------mat--------------------------
0.247033
2.545303
0.080783
----------------mat end--------------------
-------------------mat--------------------------
-0.024029
-3.006202
0.555750
----------------mat end--------------------
-------------------mat--------------------------
-0.444715
-2.875168
-0.753507
----------------mat end--------------------
-------------------mat--------------------------
0.274657
2.710503
0.283412
----------------mat end--------------------
-------------------mat--------------------------
-1.996382
-2.013420
0.107410
----------------mat end--------------------
-------------------mat--------------------------
-2.432833
-0.203065
0.185693
----------------mat end--------------------
-------------------mat--------------------------
-1.812542
-2.596642
0.526146
----------------mat end--------------------
-------------------mat--------------------------
-2.157320
-2.139232
0.381902
----------------mat end--------------------
-------------------mat--------------------------
-0.352335
-2.949382
0.728299
----------------mat end--------------------
-------------------mat--------------------------
-3.008670
-0.158527
0.680003
----------------mat end--------------------
-------------------mat--------------------------
2.957859
0.463191
-0.471083
----------------mat end--------------------
-------------------mat--------------------------
1.913895
2.186117
0.657637
----------------mat end--------------------
-------------------mat--------------------------
0.243065
2.523972
0.061037
----------------mat end--------------------
-------------------mat--------------------------
-0.040455
-3.022564
0.587618
----------------mat end--------------------
-------------------mat--------------------------
-0.448522
-2.907204
-0.739180
----------------mat end--------------------
-------------------mat--------------------------
0.270287
2.691149
0.264340
----------------mat end--------------------
tvecs
-------------------mat--------------------------
-19.988886
23.757114
135.684052
----------------mat end--------------------
-------------------mat--------------------------
-27.348545
-28.622829
129.982254
----------------mat end--------------------
-------------------mat--------------------------
27.477587
-38.877304
121.149429
----------------mat end--------------------
-------------------mat--------------------------
-56.649239
21.068739
169.330826
----------------mat end--------------------
-------------------mat--------------------------
-24.510670
-33.746979
111.023720
----------------mat end--------------------
-------------------mat--------------------------
21.140327
-45.984241
134.144012
----------------mat end--------------------
-------------------mat--------------------------
22.560535
-33.183712
124.203354
----------------mat end--------------------
-------------------mat--------------------------
15.558736
-37.992195
115.607452
----------------mat end--------------------
-------------------mat--------------------------
20.203869
-44.751049
123.997093
----------------mat end--------------------
-------------------mat--------------------------
-54.881516
-41.291859
155.745651
----------------mat end--------------------
-------------------mat--------------------------
-56.450920
27.112652
133.663742
----------------mat end--------------------
-------------------mat--------------------------
-40.990997
-35.479271
123.890732
----------------mat end--------------------
-------------------mat--------------------------
-63.884598
-25.337687
128.723404
----------------mat end--------------------
-------------------mat--------------------------
-8.913817
-36.079464
121.589745
----------------mat end--------------------
-------------------mat--------------------------
-18.384424
39.083179
160.100708
----------------mat end--------------------
-------------------mat--------------------------
-93.902374
25.361036
166.436279
----------------mat end--------------------
-------------------mat--------------------------
-60.649311
-30.763153
109.916985
----------------mat end--------------------
-------------------mat--------------------------
-15.546039
-42.856949
134.324783
----------------mat end--------------------
-------------------mat--------------------------
-13.929643
-30.286358
124.502472
----------------mat end--------------------
-------------------mat--------------------------
-20.690454
-35.141682
115.443146
----------------mat end--------------------
-------------------mat--------------------------
-16.215090
-41.770683
123.984489
----------------mat end--------------------