Opencv-霍夫圆检测-代码解析

目录

目录

前言

一、霍夫圆检测代码

二、函数解析

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函数

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) 

Opencv-霍夫圆检测-代码解析_第1张图片

Opencv-霍夫圆检测-代码解析_第2张图片

 4.cv2.circle()-画圆

它有五个参数:

  1. img:要划的线所在的图像;
  2. pt1:圆心坐标
  3. pt2:半径  ( 
  4.  color:颜色
  5. 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)

Opencv-霍夫圆检测-代码解析_第3张图片


7.cv2.imshowcv2.waitKey函数

cv2.imshow()函数需要两个输入,一个是图像窗口的名字即title,一个是所展示图片的像素值矩阵。

 Opencv-霍夫圆检测-代码解析_第4张图片

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写法默认吧。

总结

希望这些能够帮到你,但是不要盲目的复制哦

你可能感兴趣的:(opencv,python)