我希望能够确定这张(视频截图)中注射器尖端的中心位置。这些尖端名义上是圆形的,大小和数量已知。
我目前正在尝试在尖端上放置红色油墨,使其更容易被检测到。不过如果不加入红色油墨,则检测很难进行。是否有人能接受这个挑战?
我最初尝试了SimpleBlobDetector,因为它有一些不错的过滤功能。但有一件事我无法解决,那就是如何让SimpleBlobDetector检测到空心圆(环)?
然后我尝试使用canny + hough,但圆形检测太不稳定,位置会跳动。
我目前正在使用findContours + minEnclosingCircle,它可以工作,但仍然相当不稳定。掩膜看起来像这样。结果如图。您可以看到准确性还不够好: 我简要地看了一下RANSAC,但我找不到一个可以检测多个圆的Python示例,而且边缘检测也很棘手。
我的当前代码:
有没有建议来提高位置检测的准确性和稳定性?
我目前正在尝试在尖端上放置红色油墨,使其更容易被检测到。不过如果不加入红色油墨,则检测很难进行。是否有人能接受这个挑战?
我最初尝试了SimpleBlobDetector,因为它有一些不错的过滤功能。但有一件事我无法解决,那就是如何让SimpleBlobDetector检测到空心圆(环)?
然后我尝试使用canny + hough,但圆形检测太不稳定,位置会跳动。
我目前正在使用findContours + minEnclosingCircle,它可以工作,但仍然相当不稳定。掩膜看起来像这样。结果如图。您可以看到准确性还不够好: 我简要地看了一下RANSAC,但我找不到一个可以检测多个圆的Python示例,而且边缘检测也很棘手。
我的当前代码:
# https://dev59.com/HFwY5IYBdhLWcg3wh4Iq
frame_inv = ~frame0
# Convert BGR to HSV
hsv = cv2.cvtColor(frame_inv, cv2.COLOR_BGR2HSV)
blur = cv2.GaussianBlur(hsv, (5, 5), 0)
# define range of color in HSV
lower_red = np.array([90 - 10, 70, 50])
upper_red = np.array([90 + 10, 255, 255])
# Threshold the HSV image to get only red colors
mask = cv2.inRange(hsv, lower_red, upper_red)
# cv2.imshow('Mask', mask)
kernel = np.ones((5, 5), np.uint8)
dilate = cv2.dilate(mask, kernel)
# cv2.imshow('Dilate', dilate)
contours = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
tipXY = []
for c in contours:
area = cv2.contourArea(c)
if area > 200:
(x, y), r = cv2.minEnclosingCircle(c)
center = (int(x), int(y))
r = int(r)
shift = 2
factor = 2 ** shift
cv2.circle(frame0, (int(round((x) * factor)), int(round((y) * factor))),
int(round(10 * factor)), (0, 255, 0), 2, shift=shift)
tipXY.append(center)
有没有建议来提高位置检测的准确性和稳定性?