opencv实现亚像素圆中心点提取
时间: 2023-06-29 21:13:37 浏览: 354
在 OpenCV 中,可以使用 Hough 变换来检测圆形。使用 Hough 变换检测到的圆形通常只能粗略地确定圆心的位置。为了获得更精确的圆心位置,可以使用亚像素级别的技术来进行优化。
下面是使用 OpenCV 实现亚像素级别圆心提取的步骤:
1. 将图像转换为灰度图像。
2. 使用 Hough 变换检测圆形,得到大致的圆心位置。可以使用函数 HoughCircles() 来实现。
3. 对于每个检测到的圆形,使用函数 cv::cornerSubPix() 来进行亚像素级别的优化。该函数需要输入灰度图像、圆心位置和搜索窗口大小等参数。
4. 对于每个优化后的圆形,使用函数 cv::circle() 来绘制圆形和圆心。
下面是一个代码示例:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("circle.png");
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
medianBlur(gray, gray, 5);
vector<Vec3f> circles;
HoughCircles(gray, circles, HOUGH_GRADIENT, 1, gray.rows / 8, 200, 100, 0, 0);
for (size_t i = 0; i < circles.size(); i++)
{
Vec3f circle = circles[i];
Point center(circle[0], circle[1]);
int radius = circle[2];
circle(src, center, radius, Scalar(0, 0, 255), 2);
circle(src, center, 2, Scalar(0, 255, 0), 2);
Mat roi(gray, Rect(center.x - radius, center.y - radius, radius * 2, radius * 2));
Point2f offset;
cv::findNonZero(roi, offset);
offset -= Point2f(radius, radius);
center += offset;
circle(src, center, 2, Scalar(255, 0, 0), 2);
}
imshow("src", src);
waitKey(0);
return 0;
}
```
在这个示例中,我们首先读取图像并将其转换为灰度图像。然后使用 Hough 变换检测圆形,并绘制检测到的圆形和圆心。最后,对于每个圆形,使用 cv::cornerSubPix() 函数来进行亚像素级别的优化,并绘制优化后的圆心。