1. <i id='0sdWZ'><tr id='0sdWZ'><dt id='0sdWZ'><q id='0sdWZ'><span id='0sdWZ'><b id='0sdWZ'><form id='0sdWZ'><ins id='0sdWZ'></ins><ul id='0sdWZ'></ul><sub id='0sdWZ'></sub></form><legend id='0sdWZ'></legend><bdo id='0sdWZ'><pre id='0sdWZ'><center id='0sdWZ'></center></pre></bdo></b><th id='0sdWZ'></th></span></q></dt></tr></i><div id='0sdWZ'><tfoot id='0sdWZ'></tfoot><dl id='0sdWZ'><fieldset id='0sdWZ'></fieldset></dl></div>
    <legend id='0sdWZ'><style id='0sdWZ'><dir id='0sdWZ'><q id='0sdWZ'></q></dir></style></legend>
    <tfoot id='0sdWZ'></tfoot>

    • <bdo id='0sdWZ'></bdo><ul id='0sdWZ'></ul>

    1. <small id='0sdWZ'></small><noframes id='0sdWZ'>

    2. Python OpenCV基于霍夫圈变换算法检测图像中的圆形

      时间:2023-12-16
          <bdo id='adpmr'></bdo><ul id='adpmr'></ul>
            <i id='adpmr'><tr id='adpmr'><dt id='adpmr'><q id='adpmr'><span id='adpmr'><b id='adpmr'><form id='adpmr'><ins id='adpmr'></ins><ul id='adpmr'></ul><sub id='adpmr'></sub></form><legend id='adpmr'></legend><bdo id='adpmr'><pre id='adpmr'><center id='adpmr'></center></pre></bdo></b><th id='adpmr'></th></span></q></dt></tr></i><div id='adpmr'><tfoot id='adpmr'></tfoot><dl id='adpmr'><fieldset id='adpmr'></fieldset></dl></div>
              <tbody id='adpmr'></tbody>

            <legend id='adpmr'><style id='adpmr'><dir id='adpmr'><q id='adpmr'></q></dir></style></legend><tfoot id='adpmr'></tfoot>

                <small id='adpmr'></small><noframes id='adpmr'>

              • Python OpenCV基于霍夫圈变换算法检测图像中的圆形

                基本介绍

                霍夫圆变换是利用数学原理检测图像中的圆形的一种方法。它需要对每个像素点进行检测,计算出其是否可以代表一个圆。这种方法在处理较小的圆或噪声较小的图像时非常有效。

                算法步骤

                霍夫圆变换算法的具体步骤如下:

                1. 边缘检测:使用Canny算法或其他方法根据图像进行边缘检测。
                2. 霍夫变换:对于边缘图像中的每个非零像素点进行处理,生成一系列可能的圆心和半径。
                3. 圆形检测:对于每组可能的圆心和半径,计算其中多少个包含足够的边缘点(该点是通过设置阈值来确定的),如果该值超过了一个预定义的阈值,那么就可以说这个圆形是有效的。

                OpenCV的实现

                OpenCV 中可以通过调用 cv2.HoughCircles() 函数来实现霍夫圆变换算法的检测。这个函数有一些参数需要设置,如下所示:

                cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])
                

                参数说明:

                • image:8位单通道灰度输入图像
                • method:定义检测图像中的圆的方法。目前支持 CV_HOUGH_GRADIENT 标准霍夫变换方法和 CV_HOUGH_GRADIENT_ALT 一种改进型方法。
                • dp:累加器分辨率与图像分辨率的反比。它对应于霍夫空间中一组累加器的图像大小。
                • minDist:检测到的圆心之间的最小距离。
                • circles:定义输出的二维向量。向量的每个元素都包含圆的参数(3个浮点数):圆的中心坐标 (x,y) 和半径 r。
                • param1:用于处理边缘检测的阈值。
                • param2:用于检测圆度的阈值。如果阈值过高,则可能会忽略某些圆形。如果阈值过低,则可能会将其他对象误判为圆形。
                • minRadius:最小半径。
                • maxRadius:最大半径。

                下面是关于 OpenCV 霍夫圆变换的两个示例:

                示例1

                import cv2
                import numpy as np
                
                img = cv2.imread('test.jpg', 0)
                img = cv2.medianBlur(img, 5)
                cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
                circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20,
                                           param1=50, param2=30, minRadius=0, maxRadius=0)
                circles = np.uint16(np.around(circles))
                for i in circles[0, :]:
                    # draw the outer circle
                    cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)
                    # draw the center of the circle
                    cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)
                cv2.imshow('detected circles', cimg)
                cv2.waitKey(0)
                cv2.destroyAllWindows()
                

                以上代码从文件中读取了图像,并将它转为了灰度图像,然后应用了中值滤波器以消除噪声。接下来,通过将图像传递给 cv2.HoughCircles() 函数,使用标准的 CV_HOUGH_GRADIENT 霍夫变换方法来检测图像中的圆形。最终,使用 cv2.circle() 函数将检测出的圆形绘制在彩色输出图像中。

                示例2

                import cv2
                import numpy as np
                
                cap = cv2.VideoCapture(0)
                while True:
                    # Capture frame-by-frame
                    ret, frame = cap.read()
                    # Convert to gray
                    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                    # Apply Gaussian Blur
                    gray_blur = cv2.GaussianBlur(gray, (25, 25), 0)
                    # Detect Circles
                    circles = cv2.HoughCircles(gray_blur, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
                    # If circles are detected, convert the (x, y) coordinates and radius of the circles to integers
                    if circles is not None:
                        circles = np.round(circles[0, :]).astype("int")
                        # Loop over the (x, y) coordinates and radius of the circles
                        for (x, y, r) in circles:
                            # Draw the circle in the output frame
                            cv2.circle(frame, (x, y), r, (0, 255, 0), 2)
                    # Display the resulting frame
                    cv2.imshow('Circle Detection', frame)
                    if cv2.waitKey(1) & 0xFF == ord('q'):
                        break
                # When everything done, release the capture
                cap.release()
                cv2.destroyAllWindows()
                

                以上代码从摄像机捕获了连续的帧。在每个帧上,从 BGR 色彩空间转换为灰度图像,并应用了高斯模糊器以消除噪声。接下来,应用霍夫圆变换检测图像中的圆。最终,使用 cv2.circle() 函数将检测出的圆形绘制在上述的帧上。

                总结

                使用 OpenCV 的霍夫圆变换功能可以非常轻松地检测图像中的圆形。此外,OpenCV 可以与摄像机一起使用,实时地捕获并处理每一帧。巧妙使用本方法,可以实现很多实时的图像识别应用。

                上一篇:Python Pillow Image.save 保存为jpg图片压缩问题 下一篇:Python实现多线程下载文件的代码实例

                相关文章

                  <legend id='4yZrI'><style id='4yZrI'><dir id='4yZrI'><q id='4yZrI'></q></dir></style></legend>
                  • <bdo id='4yZrI'></bdo><ul id='4yZrI'></ul>

                  <small id='4yZrI'></small><noframes id='4yZrI'>

                  <i id='4yZrI'><tr id='4yZrI'><dt id='4yZrI'><q id='4yZrI'><span id='4yZrI'><b id='4yZrI'><form id='4yZrI'><ins id='4yZrI'></ins><ul id='4yZrI'></ul><sub id='4yZrI'></sub></form><legend id='4yZrI'></legend><bdo id='4yZrI'><pre id='4yZrI'><center id='4yZrI'></center></pre></bdo></b><th id='4yZrI'></th></span></q></dt></tr></i><div id='4yZrI'><tfoot id='4yZrI'></tfoot><dl id='4yZrI'><fieldset id='4yZrI'></fieldset></dl></div>
                1. <tfoot id='4yZrI'></tfoot>