gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:47:45 25 4
gpt4 key购买 nike

enter image description here

我看过几个关于在 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')

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

最佳答案

您应该注意的主要参数是minDistminRadiusmaxRadius

首先分析半径:您有一个宽 12 圈、高 8 圈的图像,它给出每个圆的直径大致为 width/12,或者半径为 (宽度/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')

结果是:

enter image description here

关于python - 如何使用 Python OpenCV 优化圆检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58109962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com