2 #include "CheckerboardDetector.hh"
3 #include <Base/Common/W32Compat.hh>
12 #include <Base/Debug/Error.hh>
13 #include <Base/Math/Vector3.hh>
14 #include <Base/Image/ImageIO.hh>
15 #include <Base/Image/ImageConvert.hh>
26 int CheckerboardDetector::cornerDetectorFlags_ = CV_CALIB_CB_ADAPTIVE_THRESH;
27 int CheckerboardDetector::subPixelIterations_ = 100;
28 double CheckerboardDetector::subPixelAccuracy_ = 0.1;
31 int CheckerboardDetector::
33 const unsigned int &xCorners,
const unsigned int &yCorners,
37 const int numCorners = xCorners*yCorners;
38 if ((
int)coords.size() != numCorners)
39 coords.resize(numCorners, std::pair<float,float>(0.0f, 0.0f));
42 IplImage* gray = NULL;
44 ImageConvert::ToGrey(img, imgGrey);
45 ImageConvert::BIAS2ipl(imgGrey, gray);
46 BIASASSERT(gray != NULL);
50 int res = cvFindChessboardCorners(gray, cvSize(xCorners, yCorners),
51 (CvPoint2D32f*)&(coords[0].first),
52 &cornersFound, cornerDetectorFlags_);
60 cvFindCornerSubPix(gray, (CvPoint2D32f*)&coords[0].first,
61 cornersFound, cvSize(5,5), cvSize(-1,-1),
62 cvTermCriteria(CV_TERMCRIT_ITER,
63 subPixelIterations_, subPixelAccuracy_));
69 ImageConvert::ToRGB(img, imgRGB);
71 ImageConvert::BIAS2ipl(imgRGB, image);
72 BIASASSERT(image != NULL);
74 DrawPoints(image, (CvPoint2D32f*)&coords[0].first,
75 cornersFound, xCorners, yCorners);
76 cvSaveImage(
"out__findChessBoardCornerGuesses.jpg", image);
77 cvReleaseImage(&image);
81 cvReleaseImage(&gray);
86 void CheckerboardDetector::
87 DrawPoints(
void* imgVoid,
void* ptArrayVoid,
88 int numPts,
const int xCorners,
const int yCorners,
89 const bool DRAW_IDEAL_OVERLAY,
const bool DRAW_AXES,
90 const bool DRAW_POINT_LABEL)
93 CvArr* img = (CvArr*)imgVoid;
94 CvPoint2D32f *ptArray = (CvPoint2D32f*)ptArrayVoid;
98 if (DRAW_POINT_LABEL) {
99 cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1.0f, 1.0f);
104 ptOld.x = (int)ptArray[0].x;
105 ptOld.y = (int)ptArray[0].y;
107 for (
int i = 0; i < numPts; i++) {
108 int clr = (int)((
float)i / numPts * 255.0);
109 pt.x = (int)ptArray[i].x;
110 pt.y = (int)ptArray[i].y;
111 cvCircle(img, pt, 3, CV_RGB(255-clr,0,clr), CV_FILLED);
113 if (DRAW_POINT_LABEL){
117 cvPutText(img, ssID.str().c_str(), pt, &font, CV_RGB(0,0,255));
124 if (DRAW_IDEAL_OVERLAY) {
127 for (
int xx = 0; xx < xCorners*yCorners; xx += xCorners) {
128 cvLine(img, cvPointFrom32f(ptArray[xx]),
129 cvPointFrom32f(ptArray[xx+xCorners-1]),
130 CV_RGB(0,0,255), 1, CV_AA);
133 for (
int yy = 0; yy < xCorners; yy += 1) {
134 cvLine(img, cvPointFrom32f(ptArray[yy]),
135 cvPointFrom32f(ptArray[yy+xCorners*(yCorners-1)]),
136 CV_RGB(0,0,255), 1, CV_AA);
142 cvInitFont(&fontBig, CV_FONT_HERSHEY_PLAIN, 5.0f, 5.0f, 0, 2, CV_AA);
143 cvPutText(img,
"0", cvPointFrom32f(ptArray[0]), &fontBig, CV_RGB(0,0,255));
144 cvLine(img, cvPointFrom32f(ptArray[0]), cvPointFrom32f(ptArray[xCorners-1]),
145 CV_RGB(255,0,0), 1, CV_AA);
146 cvPutText(img,
"X", cvPointFrom32f(ptArray[xCorners-1]),
147 &fontBig, CV_RGB(255,0,0));
148 cvLine(img, cvPointFrom32f(ptArray[0]),
149 cvPointFrom32f(ptArray[xCorners*(yCorners-1)]),
150 CV_RGB(0,255,0), 1, CV_AA);
151 cvPutText(img,
"Y", cvPointFrom32f(ptArray[xCorners*(yCorners-1)]),
152 &fontBig, CV_RGB(0,255,0));
155 cvNamedWindow(
"img", 1);
156 cvMoveWindow(
"img", 0, 0);
157 cvShowImage(
"img", img);
159 cvDestroyAllWindows();
std::vector< std::pair< float, float > > t_CoordVecf
helper vector of coordinates