如何使用 Python OpenCV 优化圆检测?

2024-03-09

我看过几页关于在 python 中使用 opencv 优化圆检测的页面。所有这些似乎都针对特定图片的具体情况。 cv2.HoughCircles 的每个参数的起点是什么?由于我不确定推荐值是什么,因此我尝试循环范围,但这并没有产生任何有希望的结果。为什么我无法检测到该图像中的任何圆圈?

import cv2
import numpy as np
image = cv2.imread('IMG_stack.png')
output = image.copy()
height, width = image.shape[:2]
maxWidth = int(width/10)
minWidth = int(width/20)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.2, 20,param1=50,param2=50,minRadius=minWidth,maxRadius=maxWidth)


if circles is not None:
    # convert the (x, y) coordinates and radius of the circles to integers
    circlesRound = np.round(circles[0, :]).astype("int")
    # loop over the (x, y) coordinates and radius of the circles
    for (x, y, r) in circlesRound:
        cv2.circle(output, (x, y), r, (0, 255, 0), 4)
    cv2.imwrite(filename = 'test.circleDraw.png', img = output)
    cv2.imwrite(filename = 'test.circleDrawGray.png', img = gray)
else:
    print ('No circles found')

这应该是一个直接的圆检测,但检测到的所有圆都不是很接近。


您应该注意的主要参数是minDist, minRadius and maxRadius.

首先分析半径:您有一个宽 12 个圆、高 8 个圆的图像,这给您的直径大约为width/12对于每个圆,或半径(width/12)/2。您使用的约束允许算法检测比所需更大或更小的圆圈,因此您应该使用更适合您的图像的参数化。在这种情况下,我使用了间隔[0.9 * radius, 1.1 * radius].

由于没有重叠,你可以说两个圆之间的距离至少是直径,所以minDist可以设置为类似的东西2*minRadius.

这个实现与你的基本相同,只是更新了这 3 个参数:

%matplotlib inline
import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread('data/balls.jpg')
output = image.copy()
height, width = image.shape[:2]
maxRadius = int(1.1*(width/12)/2)
minRadius = int(0.9*(width/12)/2)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(image=gray, 
                           method=cv2.HOUGH_GRADIENT, 
                           dp=1.2, 
                           minDist=2*minRadius,
                           param1=50,
                           param2=50,
                           minRadius=minRadius,
                           maxRadius=maxRadius                           
                          )

if circles is not None:
    # convert the (x, y) coordinates and radius of the circles to integers
    circlesRound = np.round(circles[0, :]).astype("int")
    # loop over the (x, y) coordinates and radius of the circles
    for (x, y, r) in circlesRound:
        cv2.circle(output, (x, y), r, (0, 255, 0), 4)

    plt.imshow(output)
else:
    print ('No circles found')

结果是:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Python OpenCV 优化圆检测? 的相关文章

随机推荐

  • 捕获未通过 QuickFix 验证的传入 FIX 消息

    A Quickfix http www quickfixengine org 客户端使用以下方法验证传入消息XML 规范文件 http www quickfixengine org documentation 如果消息验证失败 quickf
  • 将数据从 UITableViewCell 推送到 UINavigationController

    我有一个 UISearchDisplaycontroller 我必须将信息推送到文本字段 并需要将其链接到导航视图控制器 这是我的代码 void prepareForSegue UIStoryboardSegue segue sender
  • 具有 ADT 和 Aux 模式的类型安全

    我正在使用 ADT 和 Aux 模式设计类型安全代码 并且无法摆脱一些asInstanceOf 这是示例 sealed trait Source case object FileSystem extends Source case obje
  • 如何限制 Phusion Passenger 内存使用?

    有没有办法限制 Phusion Passenger 在提供您的应用程序时使用的内存量 在我获得大量流量后 我的主机过来并终止了该进程 因此我最终提供了空白页面 我能做些什么来表达 嘿 不要使用超过 100Mb 的内存 并且无论网站有多超载
  • 在 Rails 中的多个数据库之间切换而不破坏事务

    我正在设置一个包含多个数据库的 Rails 应用程序 它用ActiveRecord Base establish connection db config在数据库之间切换 所有数据库都在database yml中配置 establish c
  • Arrays.stream().map().sum() 性能不稳定

    我偶然发现了一个对原始数组进行非常简单的映射 归约操作的性能曲线极其不稳定的实例 这是我的 jmh 基准代码 OutputTimeUnit TimeUnit NANOSECONDS BenchmarkMode Mode AverageTim
  • 如何在按钮单击时显示文本区域?

  • 使用python删除html标签?

    我知道可能有一百万个问题 但我想知道如何删除这些标签 而无需导入或使用 HTMLParser 或正则表达式 我尝试了一堆不同的替换语句来尝试删除 包含的部分字符串 但无济于事 基本上我正在处理的是 response urlopen url
  • 动态添加ImageView到View

    我正在制作一个使用 View 类的 Android 游戏 但我没有使用 XML 布局 我所有的图像都是用画布绘制的 现在我的问题是我无法使用位图 我正在尝试将 ImageView 动态添加到我的 View 类中 以使用可触摸事件 为什么是动
  • 反应“捕获”事件处理程序是否总是在本机非捕获处理程序之前触发?

    In 这个讨论线程 https discuss reactjs org t ordering of native and react events 829 2 苏菲 阿尔珀特 https stackoverflow com users 49
  • OAuthException (#368) 尝试的操作已被视为滥用或被禁止

    我正在尝试使用 Graph API 在我的墙上或我的一些朋友的墙上发布提要 我授予了该应用程序所需的所有权限 当我从页面发出请求时允许它们 我拥有有效的访问令牌 但即使发生此异常并且没有发布提要 我的帖子请求看起来不错 已授予权限 我需要做
  • 如何在 jQuery 中选择从当前元素开始的下一个“n”元素?

    如何选择从当前元素开始的下一个 n 元素 我的意思是 this attr 我想做 n 次 以n 4为例 this attr this next attr this next next attr this next next next att
  • 回流类型密封时的满射性检查

    当密封类型上的模式匹配不详尽时 Scala 会发出警告 但是当返回类型被密封时 我们是否可以检查函数是否返回所有情况 例如 考虑以下 ADT sealed trait Foo case object Bar extends Foo case
  • 捆绑包标识符 iOS 配置门户

    我是 iOS 企业计划的团队代理 我正在尝试添加一个新的应用程序 ID 新的应用程序 ID 以前从未在我的帐户中使用过 但可能已被另一个企业帐户使用 但是 提交后 它说 The bundle identifier you have spec
  • 通过 Django 管理站点添加数据时更改大小写(大写/小写)

    我正在配置我的新项目的管理站点 我有点怀疑我应该怎么做 通过管理站点添加数据时点击 保存 所有内容都转换为大写 编辑 好的 我知道 upper 属性 并且我做了一个视图 我知道该怎么做 但我想知道管理站点上是否有任何可用于字段配置的属性 P
  • 针对 Windows Phone 7 Internet Explorer 9 的条件注释

    Problem 条件注释 例如 p All other browsers p 不工作在 Windows Phone 7 上 或者 至少不是我的 Question 有谁知道如何使用这些评论 并且有测试了他们前 WP7 上的 IE 9 是否支持
  • Java Socket 编程不适用于 10,000 个客户端

    我可以创建多个线程来支持套接字编程中的多客户端功能 工作正常 但如果有 10 000 个客户端想要连接 我的服务器就无法创建这么多线程 如何管理线程以便我可以同时监听所有这些客户端 另外 如果在这种情况下服务器想要向特定客户端发送某些内容
  • 是否可以使用 .NET Remoting + TLS 1.2(或 1.1)?

    最近我们的 PCI DSS 扫描失败 并要求我们禁用 TLS 1 0 并启用 TLS 1 1 或 1 2 我在 Windows Server 2008 R2 盒子上找到了如何执行此操作的说明 但我们有一个使用 NET 远程处理的旧应用程序
  • ActiveSupport::Memoizes 指的是哪种 Ruby memoize 模式?

    因此在 Rails 3 2 中 ActiveSupport Memoizes 已被弃用 消息内容如下 DEPRECATION WARNING ActiveSupport Memoizable is deprecated and will b
  • 如何使用 Python OpenCV 优化圆检测?

    我看过几页关于在 python 中使用 opencv 优化圆检测的页面 所有这些似乎都针对特定图片的具体情况 cv2 HoughCircles 的每个参数的起点是什么 由于我不确定推荐值是什么 因此我尝试循环范围 但这并没有产生任何有希望的