OpenCV——霍夫变换(直线检测、圆检测)

x

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3 #include <math.h>
 4
 5 using namespace cv;
 6 using namespace std;
 7
 8
 9 int main(int argc, char** argv)
10 {
11     Mat src, src_gray, dst;
12     src = imread("test1.jpg");
13
14     char INPUT_TITLE[] = "input image";
15
16     imshow(INPUT_TITLE, src);
17
18     Canny(src, src_gray, 150, 200);
19     cvtColor(src_gray, dst, CV_GRAY2BGR);
20     imshow("edge image", src_gray);
21     imshow("gray", dst);
22
23     //方法1(标准霍夫变换)
24     //vector<Vec2f> lines;
25     //HoughLines(src_gray, lines, 1, CV_PI / 180, 150, 0, 0);
26     //for (size_t i = 0; i < lines.size(); i++) {
27     //    float rho = lines[i][0]; // 极坐标中的r长度
28     //    float theta = lines[i][1]; // 极坐标中的角度
29     //    Point pt1, pt2;
30     //    double a = cos(theta), b = sin(theta);
31     //    double x0 = a * rho, y0 = b * rho;
32     //    // 转换为平面坐标的四个点
33     //    pt1.x = cvRound(x0 + 1000 * (-b));//对一个double型的数进行四舍五入,并返回一个整型数!
34     //    pt1.y = cvRound(y0 + 1000 * (a));
35     //    pt2.x = cvRound(x0 - 1000 * (-b));
36     //    pt2.y = cvRound(y0 - 1000 * (a));
37     //    line(dst, pt1, pt2, Scalar(0, 0, 255), 1, CV_AA);
38     //}
39
40
41     //第二种方法(概率霍夫变换)
42     vector<Vec4f> plines;
43     HoughLinesP(src_gray, plines, 1, CV_PI / 180.0, 10, 0, 10);
44     Scalar color = Scalar(0, 0, 255);
45     for (size_t i = 0; i < plines.size(); i++) {
46     Vec4f hline = plines[i];
47     line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3, LINE_AA);
48     }
49
50     imshow("效果图",dst);
51
52     waitKey(0);
53     return 0;
54
55 }

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3 #include <math.h>
 4
 5 using namespace cv;
 6 using namespace std;
 7
 8
 9 int main(int argc, char** argv)
10 {
11     Mat src, src_gray;
12     src = imread("3 input.bmp");
13
14     char INPUT_TITLE[] = "input image";
15
16     imshow(INPUT_TITLE, src);
17
18   //转成灰度图
19     cvtColor(src, src_gray, COLOR_BGR2GRAY);
20  
21     GaussianBlur(src_gray, src_gray, Size(9, 9), 2, 2);
22
23     //进行霍夫圆变换
24     vector<Vec3f> circles;
25     HoughCircles(src_gray, circles, HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);
26
27     for (size_t i = 0; i < circles.size(); i++)
28     {
29         Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
30         int radius = cvRound(circles[i][2]);
31             //绘制圆心
32         circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);       //绘制圆的轮廓
33         circle(src, center, radius, Scalar(155, 50, 255), 3, 8, 0);
34
35     }
36
37     imshow("效果图", src);
38
39     waitKey(0);
40     return 0;
41
42 }

霍夫圆检测一般只会找出最大的一个圆

原文地址:https://www.cnblogs.com/long5683/p/9678386.html

时间: 2024-10-08 13:19:23

OpenCV——霍夫变换(直线检测、圆检测)的相关文章

利用OpenCV霍夫变换检测出圆

利用OpenCV进行霍夫变换检测出圆形,并提取圆心坐标和半径. 程序很简单,看看就懂了. #include <opencv2/opencv.hpp> using namespace cv; using namespace std; const int kvalue = 15;//双边滤波邻域大小 int main() { Mat src_color = imread("1.png");//读取原彩色图 imshow("原图-彩色", src_color)

Opencv图像识别从零到精通(22)-----hough变换检测直线与圆

今天要看的是霍夫变换,常用用来检测直线和圆,这里是把常见的笛卡尔坐标系转换成极坐标下,进行累计峰值的极大值,确定.HoughLines,HoughLinesP,HoughCircles,三个函数,首先先看看原理,最后会用漂亮的matlab图,来回归一下,霍夫直线变换. 霍夫线变换: 众所周知, 一条直线在图像二维空间可由两个变量表示. 例如: 在 笛卡尔坐标系: 可由参数:  斜率和截距表示. 在 极坐标系: 可由参数:  极径和极角表示 对于霍夫变换, 我们将用 极坐标系 来表示直线. 因此,

OpenCV2学习笔记(八):使用霍夫变换检测直线和圆

在研究一幅图像时,常常会遇到一些平面或线性问题,直线在图像中频繁可见.这些富有意义的特征在物体识别等图像处理过程中扮演着重要的角色.本节主要记录一种经典的检测直线算法--霍夫变换(Hough Transform),用Hough变换检测图像中的直线和圆,开发平台为Qt5.3.2+OpenCV2.4.9. 一:Hough变换检测图像的直线 1.基础Hough变换 在霍夫变换中,直线用以下方程表示: 其中,参数表示一条直线到图像原点(左上角)的距离, 表示与直线垂直的角度.如下图所示,直线1的垂直线的

Python下opencv使用笔记(十一)(详解hough变换检测直线与圆)

在数字图像中,往往存在着一些特殊形状的几何图形,像检测马路边一条直线,检测人眼的圆形等等,有时我们需要把这些特定图形检测出来,hough变换就是这样一种检测的工具. Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等). 关于hough变换,核心以及难点就是关于就是有原始空间到参数空间的变换上.以直线检测为例,假设有一条直线L,

opencv学习笔记霍夫变换——直线检测

参考大佬博文:blog.csdn.net/jia20003/article/details/7724530 lps-683.iteye.com/blog/2254368 openCV里有两个函数(比较常用)处理霍夫变换直线检测,有什么区别呢. CvHoughLine:是用于标准的霍夫变换方法 CvHoughLine2:可以使用三种霍夫变换的方法,分别是标准霍夫变换(SHT).多尺度标准霍夫变换(MSHT).累计概率霍夫变换(PPHT). 函数原型: CvSeq* cvHoughLines2( C

opencv 检测直线 线段 圆 矩形

转自:http://blog.csdn.net/byxdaz/archive/2009/12/01/4912136.aspx 检测直线:cvHoughLines,cvHoughLines2 检测圆:cvHoughCircles 检测矩形:opencv中没有对应的函数,下面有段代码可以检测矩形,是通过先找直线,然后找到直线平行与垂直的四根线. 检测直线代码: /* This is a standalone program. Pass an image name as a first paramet

【CImg】霍夫变换——直线检测

霍夫变换——直线检测 此处膜拜大神(学到很多):http://blog.csdn.net/jia20003/article/details/7724530 这个博客更了很多图像处理算法的底层实现解析,都很详细易懂,先mark ========================我是分割线============================= 霍夫变换:CV中常用的识别几何图形的方法,其中最简单的应用就是直线检测 主要原理是对于边缘的每一个像素点(x0,y0),把可能经过它的所有直线y=kx+b,

【OpenCV入门指南】第七篇 线段检测与圆检测

[OpenCV入门指南]第七篇 线段检测与圆检测 在<[OpenCV入门指南]第五篇轮廓检测上>与<[OpenCV入门指南]第六篇轮廓检测下>讲解了OpenCV的轮廓检测.本篇将讲解在OpenCV中使用线段检测与圆检测. 线段检测与圆检测主要运用Hough变换,Hough变换是一种利用图像的全局特征将特定形状的边缘连接起来,形成连续平滑边缘的一种方法.它通过将源图像上的点影射到用于累加的参数空间,实现对已知解析式曲线进行识别. 在OpenCV编程中,线段检测和圆检测已经封装成函数了

Python+OpenCV图像处理之圆检测

霍夫变换不仅可以用来检测直线,同样也可以用来检测圆 python实现 import cv2 import numpy as np __author__ = "boboa" def detect_circles_demo(image): dst = cv2.pyrMeanShiftFiltering(image, 10, 100) # 均值偏移滤波 cimage = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY) circles = cv2.HoughCirc