bool Calibration::detectAndDrawChessboard(int idx, image_pool* pool)
{
+ bool patternfound = false;
Mat grey = pool->getGrey(idx);
if (grey.empty())
return false;
vector<Point2f> corners;
-
IplImage iplgrey = grey;
- if (!cvCheckChessboard(&iplgrey, patternsize))
+ patternfound = cvCheckChessboard(&iplgrey, patternsize);
+ if (!patternfound)
return false;
- bool patternfound = findChessboardCorners(grey, patternsize, corners);
+
+ float factor = grey.cols / 320.0f;
+ if (factor < 1)
+ factor = 1;
+ cv::Size r_size = cv::Size(grey.cols / factor, grey.rows / factor);
+ Mat grey_sub;
+ while (patternfound && (r_size.width < grey.size().width))
+ {
+ cv::resize(grey, grey_sub, r_size);
+ patternfound = findChessboardCorners(grey_sub, patternsize, corners);
+ if (patternfound)
+ {
+ r_size.width *= 2;
+ r_size.height *= 2;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ // hopefully if we're going to fail we fail on a smaller size image in the while-loop
+ patternfound = findChessboardCorners(grey, patternsize, corners);
Mat img = pool->getImage(idx);
if (corners.size() < 1)
return false;
- cornerSubPix(grey, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
-
if (patternfound)
+ {
+ cornerSubPix(grey, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
imagepoints.push_back(corners);
+ }
drawChessboardCorners(img, patternsize, Mat(corners), patternfound);