c++ opencv精确提取圆形标定板,圆心角点坐标,代码示意
时间: 2024-10-12 07:07:12 浏览: 77
Opencv圆形提取C++代码
3星 · 编辑精心推荐
在OpenCV中,提取圆形标定板并定位其圆心通常涉及使用Hough Circle Transform。这是一个基于概率的方法,用于检测图像中的圆形轮廓。下面是一个简单的C++代码示例,演示如何使用OpenCV库来实现这个功能:
```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>
// 函数声明
std::vector<cv::Vec3f> findCircles(const cv::Mat& img);
int main(int argc, char** argv)
{
// 加载图片
cv::Mat src = cv::imread("board_image.jpg", cv::IMREAD_GRAYSCALE);
if (src.empty())
{
std::cout << "Failed to load image" << std::endl;
return -1;
}
// 转换到二值图像
cv::threshold(src, src, 50, 255, cv::THRESH_BINARY_INV + cv::THRESH_OTSU);
// 使用霍夫圆变换
std::vector<cv::Vec3f> circles = findCircles(src);
// 遍历找到的圆形,并打印圆心坐标
for (const auto& circle : circles)
{
int x = circle[0];
int y = circle[1];
float radius = circle[2];
std::cout << "Circle center at (" << x << ", " << y << ") with radius " << radius << std::endl;
}
return 0;
}
// 自定义函数:查找圆形
std::vector<cv::Vec3f> findCircles(const cv::Mat& img)
{
std::vector<cv::Vec3f> circles;
cv::HoughCircles(img, circles, cv::HOUGH_GRADIENT, 1, img.rows/8, 200, 100, 0, 0); // 参数调整可能需要实验
// 可能需要对结果进行过滤,比如去除过小或过大、噪声等
circles.erase(std::remove_if(circles.begin(), circles.end(),
[](cv::Vec3f &circle) { return std::abs(circle[2] - cvRound(circle[2])) > 5; }), circles.end());
return circles;
}
```
这个例子中,我们首先加载并转换成灰度图,然后应用Hough Circle Transform寻找可能的圆。`findCircles`函数返回一个包含三个元素的向量,每个元素代表一个圆的中心位置(x, y)和半径。注意,实际应用中可能需要根据图像质量和特定需求微调Hough变换的参数。
阅读全文