16 #include <mrpt/otherlibs/do_opencv_includes.h> 37 unsigned int check_size_x,
unsigned int check_size_y,
bool normalize_image,
38 bool useScaramuzzaMethod)
43 ASSERT_(check_size_y > 0 && check_size_x > 0);
51 bool corners_found =
false;
53 const CvSize check_size = cvSize(check_size_x, check_size_y);
55 const int CORNERS_COUNT = check_size_x * check_size_y;
57 vector<CvPoint2D32f> corners_list;
58 corners_count = CORNERS_COUNT;
59 corners_list.resize(CORNERS_COUNT);
63 int find_chess_flags = cv::CALIB_CB_ADAPTIVE_THRESH;
64 if (normalize_image) find_chess_flags |= cv::CALIB_CB_NORMALIZE_IMAGE;
67 if (!useScaramuzzaMethod)
69 vector<cv::Point2f> pointbuf;
73 cvImg, check_size, pointbuf, find_chess_flags);
75 corners_list.resize(pointbuf.size());
76 for (
size_t i = 0; i < pointbuf.size(); i++)
78 corners_list[i].x = pointbuf[i].x;
79 corners_list[i].y = pointbuf[i].y;
90 if (corners_found && corners_count != CORNERS_COUNT) corners_found =
false;
97 &iplImg, &corners_list[0], corners_count, cvSize(5, 5),
99 cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 10, 0.01f));
104 for (
y = 0, k = 0;
y < check_size.height;
y++)
105 for (
int x = 0;
x < check_size.width;
x++, k++)
106 cornerCoords.emplace_back(corners_list[k].x, corners_list[k].y);
109 return corners_found;
135 std::vector<std::vector<TPixelCoordf>>& cornerCoords,
136 unsigned int check_size_x,
unsigned int check_size_y)
144 std::vector<std::vector<CvPoint2D32f>> corners_list;
148 img, cvSize(check_size_x, check_size_y), corners_list);
150 if (corners_found && !corners_list.empty())
153 cornerCoords.resize(corners_list.size());
156 for (
size_t i = 0; i < corners_list.size(); i++)
158 ASSERT_(corners_list[i].
size() == check_size_x * check_size_y);
161 &img_ipl, &corners_list[i][0], check_size_x * check_size_y,
164 cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 10, 0.01f));
167 for (
unsigned int y = 0, k = 0;
y < check_size_y;
y++)
168 for (
unsigned int x = 0;
x < check_size_x;
x++, k++)
170 corners_list[i][k].
x, corners_list[i][k].
y));
179 cornerCoords[i][0].y},
180 pt_x1{cornerCoords[i][1].x, cornerCoords[i][1].y},
181 pt_y1{cornerCoords[i][check_size_x].x,
182 cornerCoords[i][check_size_x].y};
190 for (
unsigned int y = 0;
y < check_size_y;
y++)
192 cornerCoords[i].
begin() +
y * check_size_x,
193 cornerCoords[i].
begin() + (
y + 1) * check_size_x);
199 cornerCoords.clear();
void findMultipleChessboardsCorners(const mrpt::img::CImage &img, std::vector< std::vector< mrpt::img::TPixelCoordf >> &cornerCoords, unsigned int check_size_x, unsigned int check_size_y)
Look for the corners of one or more chessboard/checkerboards in the image.
Shallow copy: the copied object is a reference to the original one.
A pair (x,y) of pixel coordinates (subpixel resolution).
void crossProduct3D(const T &v0, const U &v1, V &vOut)
Computes the cross product of two 3D vectors, returning a vector normal to both.
#define ASSERT_(f)
Defines an assertion mechanism.
This base provides a set of functions for maths stuff.
bool findChessboardCorners(const mrpt::img::CImage &img, std::vector< mrpt::img::TPixelCoordf > &cornerCoords, unsigned int check_size_x, unsigned int check_size_y, bool normalize_image=true, bool useScaramuzzaMethod=false)
Look for the corners of a chessboard in the image using one of two different methods.
Classes for computer vision, detectors, features, etc.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
const_iterator begin() const
struct _IplImage IplImage
bool find_chessboard_corners_multiple(const CImage &img_, CvSize pattern_size, std::vector< std::vector< CvPoint2D32f >> &out_corners)
int cvFindChessboardCorners3(const CImage &img_, CvSize pattern_size, std::vector< CvPoint2D32f > &out_corners)
A class for storing images as grayscale or RGB bitmaps.