opencv c++识别图片中所有2x2棋盘格 并保存中心点坐标
时间: 2024-02-09 13:10:28 浏览: 268
要识别图片中的所有2x2棋盘格并保存中心点坐标,可以使用以下步骤:
1. 加载图像并将其转换为灰度图像。
2. 定义2x2棋盘格的大小。
3. 使用findChessboardCorners函数查找所有棋盘格的角点。
4. 对每个棋盘格的角点进行透视变换,将其变换为矩形。
5. 计算每个矩形的中心点坐标并将其保存。
以下是示例代码:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat image = imread("chessboard.jpg");
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
Size patternSize(2, 2);
std::vector<Point2f> corners;
bool found = findChessboardCorners(gray, patternSize, corners, CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_NORMALIZE_IMAGE);
if (found)
{
std::vector<Point2f> dstCorners = { Point2f(0, 0), Point2f(patternSize.width - 1, 0), Point2f(patternSize.width - 1, patternSize.height - 1), Point2f(0, patternSize.height - 1) };
std::vector<Point2f> centers;
for (int i = 0; i < corners.size(); i += 4)
{
std::vector<Point2f> srcCorners = { corners[i], corners[i + 1], corners[i + 2], corners[i + 3] };
Mat transform = getPerspectiveTransform(srcCorners, dstCorners);
std::vector<Point2f> transformedCorners;
perspectiveTransform(srcCorners, transformedCorners, transform);
Point2f center((transformedCorners[0].x + transformedCorners[2].x) / 2, (transformedCorners[0].y + transformedCorners[2].y) / 2);
centers.push_back(center);
}
// 在图像中绘制中心点
for (auto center : centers)
{
circle(image, center, 3, Scalar(255, 0, 0), -1);
}
imshow("Chessboard", image);
waitKey();
}
return 0;
}
```
在这个示例中,我们使用CALIB_CB_ADAPTIVE_THRESH和CALIB_CB_NORMALIZE_IMAGE标志来提高棋盘格检测的鲁棒性。通过for循环遍历每个棋盘格的角点,我们使用getPerspectiveTransform函数计算透视变换矩阵,并使用perspectiveTransform函数将每个角点变换为矩形。然后,我们计算矩形的中心点坐标并将其保存到一个vector中。最后,我们在图像中绘制所有中心点并显示结果。
阅读全文