openCV 圆点标定
时间: 2023-05-22 09:02:40 浏览: 144
对于OpenCV的圆点标定,您可以使用cv::calibrateCamera和cv::findCirclesGrid函数来进行实现。calibrateCamera函数可用于计算摄像机的内部参数和畸变系数,而findCirclesGrid函数则可用于查找并确定图像中的圆点。以下是一些例子代码:
// 加载图像
cv::Mat img = cv::imread("photo.png");
// 构建棋盘格模板
cv::Size patternSize(10, 7);
cv::Mat pattern = cv::Mat::zeros(patternSize.width * patternSize.height, 3, CV_32FC1);
for (int i = 0; i < patternSize.height; ++i)
for (int j = 0; j < patternSize.width; ++j)
pattern.at<float>(i * patternSize.width + j, 0) = j * 25.f;
for (int i = 0; i < patternSize.height; ++i)
for (int j = 0; j < patternSize.width; ++j)
pattern.at<float>(i * patternSize.width + j, 1) = i * 25.f;
// 查找圆点
std::vector<cv::Point2f> points;
bool found = cv::findCirclesGrid(img, patternSize, points, cv::CALIB_CB_ASYMMETRIC_GRID);
// 标定
cv::Mat cameraMatrix, distCoeffs;
std::vector<cv::Mat> rvecs, tvecs;
std::vector<std::vector<cv::Point3f>> objectPoints(1, pattern);
std::vector<std::vector<cv::Point2f>> imagePoints(1, points);
cv::calibrateCamera(objectPoints, imagePoints, img.size(), cameraMatrix, distCoeffs, rvecs, tvecs);
需要注意的是,这里的参数patternSize应当与你所拍摄的图像中圆点的行列数目相同,而参数pattern中的“j * 25.f”和“i * 25.f”则应当根据你所使用的圆点模板的物理尺寸进行修改。
阅读全文