Tor*_*iam 6 python geometry opencv shapes detection
我在为 HoughCircles 函数选择正确的参数时遇到问题。我尝试从视频中检测圆圈。这个圆圈是我做的,尺寸几乎一样。问题是相机在移动。
当我更改 maxRadius 时,它仍然以某种方式检测到更大的圆圈(见右图)。我也尝试更改 param1, param2 但仍然没有成功。

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.medianBlur(gray, 25)#cv2.bilateralFilter(gray,10,50,50)
minDist = 100
param1 = 500
param2 = 200#smaller value-> more false circles
minRadius = 5
maxRadius = 10
circles = cv2.HoughCircles(blurred, cv2.HOUGH_GRADIENT, 1, minDist, param1, param2, minRadius, maxRadius)
if circles is not None:
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
cv2.circle(blurred,(i[0], i[1]), i[2], (0, 255, 0), 2)
Run Code Online (Sandbox Code Playgroud)
也许我使用了错误的功能?
nat*_*ncy 12
cv2.HoughCircles这里有一种使用轮廓过滤的替代方法,而不必费力地选择正确的参数。这个想法是获得具有大津阈值的二值图像,然后执行形态学操作以隔离椭圆形轮廓。最后,我们使用纵横比和轮廓面积找到轮廓并进行过滤。结果如下:
import cv2
import numpy as np
# Load image, grayscale, median blur, Otsus threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.medianBlur(gray, 11)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
# Morph open
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=3)
# Find contours and filter using contour area and aspect ratio
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.04 * peri, True)
area = cv2.contourArea(c)
if len(approx) > 5 and area > 1000 and area < 500000:
((x, y), r) = cv2.minEnclosingCircle(c)
cv2.circle(image, (int(x), int(y)), int(r), (36, 255, 12), 2)
cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.imshow('image', image)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)
Rot*_*tem 12
代码中的主要问题是HoughCircles函数的第五个参数。
根据文档,参数列表是:
\n\ncv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) \xe2\x86\x92 circles
这意味着第五个参数适用circles(它提供了一个通过引用获取输出的选项,而不是使用返回值)。
因为您没有传递circles参数,所以必须为第四个参数之后的所有参数传递命名参数(例如param1=param1, param2=param2....)。
参数调整问题:
\n\nparam1。\nparam1是传递给 Canny 的较高阈值。30. param2\n文档不太清楚,但设置周围的值50是可行的。 maxRadius值 - 半径10比圆的半径小得多。 这是代码:
\n\nimport numpy as np\nimport cv2\n\nimg = cv2.imread(\'circles.png\')\n\ngray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n\nblurred = cv2.medianBlur(gray, 25) #cv2.bilateralFilter(gray,10,50,50)\n\nminDist = 100\nparam1 = 30 #500\nparam2 = 50 #200 #smaller value-> more false circles\nminRadius = 5\nmaxRadius = 100 #10\n\n# docstring of HoughCircles: HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) -> circles\ncircles = cv2.HoughCircles(blurred, cv2.HOUGH_GRADIENT, 1, minDist, param1=param1, param2=param2, minRadius=minRadius, maxRadius=maxRadius)\n\nif circles is not None:\n circles = np.uint16(np.around(circles))\n for i in circles[0,:]:\n cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)\n\n# Show result for testing:\ncv2.imshow(\'img\', img)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\nRun Code Online (Sandbox Code Playgroud)\n\n结果:
\n\n\n| 归档时间: |
|
| 查看次数: |
6616 次 |
| 最近记录: |