/
CameraCalibrator.cpp
71 lines (59 loc) · 1.63 KB
/
CameraCalibrator.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "CameraCalibrator.h"
int CameraCalibrator::addChessboardPoints(const std::vector<std::string>& filelist,cv::Size & boardSize)
{
std::vector<cv::Point2f> imageCorners;
std::vector<cv::Point3f> objectCorners;
// Óãëû â 3D ïðîñòðàíñòâå (X,Y,Z)= (i,j,0)
for (int i=0; i<boardSize.height; i++) {
for (int j=0; j<boardSize.width; j++) {
objectCorners.push_back(cv::Point3f(i, j, 0.0f));
}
}
cv::Mat image,image1;
int successes = 0; //ñ÷åò÷èê óäà÷íûõ èçîáðàæåíèé
for (int i=0; i<filelist.size(); i++) {
//çàãðóçêà èçîáðàæåíèÿ è ïåðåâîä â ÷åðíî-áåëîå
image1 = cv::imread(filelist[i],CV_LOAD_IMAGE_COLOR);
cvtColor(image1,image, CV_BGR2GRAY);
// ïîèñê óãëîâ â ïèêñåëÿõ
bool found = cv::findChessboardCorners(image, boardSize, imageCorners);
if (found)
{
//óòî÷íåíèå
cv::cornerSubPix(image, imageCorners,
cv::Size(5,5),
cv::Size(-1,-1),
cv::TermCriteria(cv::TermCriteria::MAX_ITER +
cv::TermCriteria::EPS,
30,
0.1));
//äîáàâëåíèå îñîáûõ òî÷åê
if (imageCorners.size() == boardSize.area()) {
addPoints(imageCorners, objectCorners);
successes++;
}
}
}
return successes;
}
void CameraCalibrator::addPoints(const std::vector<cv::Point2f>&imageCorners, const std::vector<cv::Point3f>& objectCorners) {
//äîáàâëåíèå îñîáîé òî÷êè
imagePoints.push_back(imageCorners);
objectPoints.push_back(objectCorners);
}
double CameraCalibrator::calibrate(cv::Size &imageSize)
{
std::vector<cv::Mat> rvecs, tvecs;
return
calibrateCamera(objectPoints,
imagePoints,
imageSize,
cameraMatrix,
distCoeffs,
rvecs, tvecs,
flag);
}
cv::Mat CameraCalibrator::showM()
{
return cameraMatrix;
}