本文章介绍了如何利用C++编程语言结合OpenCV3库来实现图像中的霍夫圆与直线检测,适合计算机视觉爱好者和技术开发者参考学习。
在计算机视觉领域,OpenCV库提供了强大的图像处理和分析功能,其中包括霍夫变换(Hough Transform)算法,用于检测图像中的直线和圆。本篇文章将详细介绍如何使用OpenCV3和C++来实现霍夫直线检测和霍夫圆检测。
我们来看霍夫直线检测。霍夫直线检测是基于极坐标系统进行的,它通过将像素空间中的点映射到极坐标空间中的一条曲线来找到直线。OpenCV中的`HoughLinesP`函数实现了这一过程。参数包括:
1. `InputArray src`:输入图像,应为8位灰度图像。
2. `OutputArray lines`:输出的直线信息,是一个`vector`,每个`Vec4i`包含了两条点的坐标。
3. `double rho`:像素扫描步长,通常单位是像素。
4. `double theta`:角度步长,一般取`CV_PI/180`,即1度。
5. `int threshold`:累加器阈值,达到这个值的极坐标点被视为直线的一部分。
6. `double minLineLength`:定义了最小长度的直线,小于这个长度的线段会被忽略。
7. `double maxLineGap`:定义了最大允许的线段间隔,超过这个间隔的连续线段会被合并。
以下是一个简单的霍夫直线检测代码示例:
```cpp
#include
int main() {
Mat src, dst;
src = imread(image_line.jpg);
if (src.empty()) {
printf(can not load image\n);
return -1;
}
cv::namedWindow(input, CV_WINDOW_AUTOSIZE);
imshow(input, src);
dst = Mat::zeros(src.size(), src.type());
cvtColor(src, dst, CV_RGB2GRAY);
Canny(dst, dst, 0, 200); // 边缘检测
vector plines;
HoughLinesP(dst, plines, 1, CV_PI/180.0, 150, 10, 10);
for (size_t i = 0; i < plines.size(); i++) {
Vec4i points = plines[i];
line(src, Point(points[0], points[1]), Point(points[2], points[3]), Scalar(0, 255, 255), 3, CV_AA);
}
cv::namedWindow(output, CV_WINDOW_AUTOSIZE);
imshow(output, src);
waitKey();
return 0;
}
```
接下来,我们讨论霍夫圆检测。霍夫圆检测同样在极坐标空间进行,但更复杂,因为它需要找到所有可能的圆心和半径。`HoughCircles`函数是专门用于检测圆形特征的。参数包括:
1. `InputArray image`:输入图像,必须是8位单通道灰度图像。
2. `OutputArray circles`:输出的圆信息,包含圆心坐标和半径。
3. `Int method`:使用的方法,例如`HOUGH_GRADIENT`。
4. `Double dp`:图像分辨率的倒数。
5. `Double mindist`:两圆心间的最小距离,用于区分相邻的圆。
6. `Double param1`:用于Canny边缘检测的高阈值,低阈值是其一半。
7. `Double param2`:中心点累加器阈值。
8. `Int minradius`:最小半径。
9. `Int maxradius`:最大半径。
以下是一个霍夫圆检测的代码示例:
```cpp
#include
int main() {
Mat src, dst;
src = imread(image_circles.jpg);
if (src.empty()) {
printf(can not load image\n);
return -1;
}
cv::namedWindow(input, CV_WINDOW_AUTOSIZE);
imshow(input, src);
cvtColor(src, src, CV_RGB2GRAY);
dst = src.clone();
cvtColor(dst, dst, CV_GRAY2RGB); // 中值滤波
medianBlur(src, src, 3);
vector circles;
HoughCircles(src, circles, CV_HOUGH_GRADIENT, 1.0, 100.0, 45.0, 30.0, 45.0, 220);
for (size_t i = 0; i < circles.size(); ++i) {
float x = circles[i][0], y = circles[i][1], r = circles[i