目录
目录
前言
一、霍夫圆检测代码
二、函数解析
1.cv2.HoughCircles函数
2.双边滤波:bilateralFilter() 函数
3.形态学操作-开运算
4.cv2.circle()-画圆
5.cv2.putText函数
6.opencv的RGB 颜色表
7.cv2.imshow和cv2.waitKey函数
编辑
8.霍夫圆思路
总结
前言
刚入门opencv时,霍夫圆检测是一个很好的练手项目,下面我将会展示代码,并对函数进行解析。
一、霍夫圆检测代码
import numpy as np
import cv2
cap =cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')) #前一个代表用4个字符表示的视频编码格式 #后一个为保存的视频格式
# ret = cap.set(3, 640) # 设置帧宽
# ret = cap.set(4, 480) # 设置帧高
font = cv2.FONT_HERSHEY_SIMPLEX # 设置字体样式
kernel = np.ones((5, 5), np.uint8) # 卷积核
if cap.isOpened() is True: # 检查摄像头是否正常启动
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 转换为灰色通道
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 转换为HSV空间
# 消除噪声
opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel) # 形态学开运算
bila = cv2.bilateralFilter(opening, 10, 100, 200) # 双边滤波消除噪声
edges = cv2.Canny(opening, 50, 100) # 边缘识别
# 识别圆形
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 50, param1=100, param2=75, minRadius=10, maxRadius=240)
if circles is not None: # 如果识别出圆
for circle in circles[0]:
# 获取圆的坐标与半径
x = int(circle[0])
y = int(circle[1])
r = int(circle[2])
cv2.circle(frame, (x, y), r, (0, 255, 0), 3) # 标记圆
cv2.circle(frame, (x, y), 6, (255, 255, 0), -1) # 标记圆心
text = 'x: ' + str(x) + ' y: ' + str(y)
cv2.putText(frame, text, (10, 30), font, 1, (0, 255, 0), 2, cv2.LINE_AA, 0) # 显示圆心位置
else:
# 如果识别不出,显示圆心不存在
cv2.putText(frame, 'x: None y: None', (10, 30), font, 1, (0, 255, 0), 2, cv2.LINE_AA, 0)
cv2.imshow('frame', frame)
cv2.imshow('edges', edges)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
else:
print('cap is not opened!')
二、函数解析
1.cv2.HoughCircles函数
import numpy as np
import cv2
cap =cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')) #前一个代表用4个字符表示的视频编码格式 #后一个为保存的视频格式
# ret = cap.set(3, 640) # 设置帧宽
# ret = cap.set(4, 480) # 设置帧高
font = cv2.FONT_HERSHEY_SIMPLEX # 设置字体样式
kernel = np.ones((5, 5), np.uint8) # 卷积核
if cap.isOpened() is True: # 检查摄像头是否正常启动
while True:
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 转换为灰色通道
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 转换为HSV空间
# 消除噪声
opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel) # 形态学开运算
bila = cv2.bilateralFilter(opening, 10, 100, 200) # 双边滤波消除噪声
edges = cv2.Canny(opening, 50, 100) # 边缘识别
# 识别圆形
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 50, param1=100, param2=75, minRadius=10, maxRadius=240)
if circles is not None: # 如果识别出圆
for circle in circles[0]:
# 获取圆的坐标与半径
x = int(circle[0])
y = int(circle[1])
r = int(circle[2])
cv2.circle(frame, (x, y), r, (0, 255, 0), 3) # 标记圆
cv2.circle(frame, (x, y), 6, (255, 255, 0), -1) # 标记圆心
text = 'x: ' + str(x) + ' y: ' + str(y)
cv2.putText(frame, text, (10, 30), font, 1, (0, 255, 0), 2, cv2.LINE_AA, 0) # 显示圆心位置
else:
# 如果识别不出,显示圆心不存在
cv2.putText(frame, 'x: None y: None', (10, 30), font, 1, (0, 255, 0), 2, cv2.LINE_AA, 0)
cv2.imshow('frame', frame)
cv2.imshow('edges', edges)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
else:
print('cap is not opened!')
1.cv2.HoughCircles函数
circles = cv2.HoughCircles(image, method, dp, minDist, param1=100, param2=100, minRadius=0, maxRadius=0)
1.image:输入图像(灰度图)/输入摄像头设备
2.method:使用霍夫变换圆检测的算法,参数为cv2.HOUGH_GRADIENT
3.dp:霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小一致,dp=2时霍夫空间是输入图像空间的一半,以此类推(显示圆关键)
4.minDist:为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心(值小会检测到多个圆,值过大无法检测到圆)
5.param1:边缘检测时使用Canny算子的高阈值,低阈值是高阈值的一半
6.param2∶检测圆心和确定半径时所共有的阈值(实际上是显示假圆的数目,值越高,显示出假圆数目越少;param2是检测阶段圆心的累加器阈值。它越小,可能检测到的假圆越多(因为满足累加器上限的条件变多了)。与累加器最大数值结果代表的圆将被首先返回。)
7.minRadius和maxRadius:为所检测到的圆半径的最小值和最大值
circles:输出圆向量,包括三个浮点型的元素――圆心横坐标,圆心纵坐标和圆半径。(赋值时按默认顺序赋值即可,注意数据类型)
2.双边滤波:bilateralFilter() 函数
bilateralFilter ( InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType = BORDER_DEFAULT )
1.src:输入图像
2.d:过滤时周围每个像素领域的直径
3.sigmaColor:在color space中过滤sigma。参数越大,临近像素将会在越远的地方mix。
4.sigmaSpace:在coordinate space中过滤sigma。参数越大,那些颜色足够相近的的颜色的影响越大。
3.形态学操作-开运算
opening= cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
4.cv2.circle()-画圆
它有五个参数:
- img:要划的线所在的图像;
- pt1:圆心坐标
- pt2:半径 (
- color:颜色
- thickness=1:线条粗细,默认是1.如果一个闭合图形设置为-1,那么整个图形就会被填充(可以改变数值)
如果画圆心 cv2.circle(frame, (x, y), 6, (255, 255, 0), -1) # 标记圆心
5.cv2.putText函数
cv2.putText(image, text, (5,50 ), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
- 图片
- 要添加的文字
- 文字添加到图片上的位置
- 字体的类型
- 字体大小
- 字体颜色
- 字体粗细
6.opencv的RGB 颜色表
RGB(255,23,140)是光的三原色,也即是红绿蓝Red,Green,Blue,它们的最大值是255,相当于100%。
白色:rgb(255,255,255)
黑色:rgb(0,0,0)
红色:rgb(255,0,0)
绿色:rgb(0,255,0)
蓝色:rgb(0,0,255)
青色:rgb(0,255,255)
紫色:rgb(255,0,255)
7.cv2.imshow和cv2.waitKey函数
cv2.imshow()函数需要两个输入,一个是图像窗口的名字即title,一个是所展示图片的像素值矩阵。
waitkey控制着imshow的持续时间,当imshow之后不跟waitkey时,相当于没有给imshow提供时间展示图像,所以只有一个空窗口一闪而过。添加了waitkey后,哪怕仅仅是cv2.waitkey(1),我们也能截取到一帧的图像。所以cv2.imshow后边是必须要跟cv2.waitkey的。
8.霍夫圆思路
本次程序引用cv2和numpy。使用cv2.videocapture开启摄像头,默认摄像头数据为0,若有多个摄像头依次添加即可。可进行摄像头参数设置,使用cap.set,同时利用它设置帧宽和帧高。摄像头是否开启的检测使用使用cap.isOpened() is True,true代表框是否闭合,如不闭合,使用false。同时对图片换名,转换为灰色通道和hsv空间,开启形态学开运算,实际上包括膨胀和腐蚀,也是去除杂质一种方法。接下来进行消噪,采用双边滤波方法,使用bilateralFilter() 函数,接下来进行边缘识别,采用cv2.Canny函数。最重要的我们将识别圆,采用cv2.HoughCircles函数,circles = cv2.HoughCircles(image, method, dp, minDist, param1=100, param2=100, minRadius=0, maxRadius=0),同时它的返回值为包括三个浮点型的元素――圆心横坐标,圆心纵坐标和圆半径。(赋值时按默认顺序赋值即可,注意数据类型)最后检测一下是否识别到圆:if circles is not None。X,y,r值赋值、标识圆和圆心:cv2.circle(frame, (x, y), 6, (255, 255, 0), -1),-1其实代表一种检测,如果图形为闭合,那么图形将被填充。在窗口上打印出圆心的坐标,如果没有识别圆心,输出没有。
Cv2.imshou显示出两个窗口,一个灰度,一个正常。同时采用cv2.waitkey函数。k = cv2.waitKey(5) & 0xFF写法默认吧。文章来源:https://uudwc.com/A/r5XD
总结
希望这些能够帮到你,但是不要盲目的复制哦文章来源地址https://uudwc.com/A/r5XD