我有一个有5个油滴的视频,我正试图用cv2.houghcirles找到它们。
这是我的代码:
import cv, cv2
import numpy as np
foreground1 = cv2.imread("foreground1.jpg")
vid = cv2.VideoCapture("NB14.avi")
cv2.namedWindow("video")
cv2.namedWindow("canny")
cv2.namedWindow("blur")
while True:
ret, frame = vid.read()
subtract1 = cv2.subtract( foreground1, frame)
framegrey1 = cv2.cvtColor(subtract1, cv.CV_RGB2GRAY)
blur = cv2.GaussianBlur(framegrey1, (0,0), 2)
circles = cv2.HoughCircles(blur, cv2.cv.CV_HOUGH_GRADIENT, 2, 10, np.array([]), 40, 80, 5, 100)
if circles is not None:
for c in circles[0]:
cv2.circle(frame, (c[0],c[1]), c[2], (0,255,0),2)
edges = cv2.Canny( blur, 40, 80 )
cv2.imshow("video", frame)
cv2.imshow("canny", edges)
cv2.imshow("blur", blur)
key = cv2.waitKey(30)
我认为canny边缘检测器看起来非常好,而hough变换的结果非常不稳定,每个帧都会提供不同的结果。
示例:
我一直在玩参数,老实说,我不知道如何得到更稳定的结果。
起初我以为你的油滴里不会有重叠,但有。所以,霍夫可能确实是一个很好的方法来使用这里,但我有更好的经验,当结合兰萨克与它。我建议你去探索一下,但在这里我会提供一些不同的东西。
首先,我不能执行你做的背景减法,因为我没有这个“foreground1.jpg”图像(所以结果可以很容易地改进)。我也不在乎画圆,但你可以这么做,我只是画我认为是圆的物体的边界。
所以,首先让我们假设没有重叠。然后在你的图像中找到边缘(简单),用Otsu对边缘检测器的响应进行二值化,填充孔洞,最后测量圆度就足够了。如果有重叠,我们可以使用分水岭变换和距离变换来分离液滴。问题是你不会得到真正的圆形物体,我也不太在意,但你可以调整。
在下面的代码中,我还必须使用
scipy
来标记连接的组件(对于构建分水岭的标记很重要),因为OpenCV在这方面是缺乏的。代码并不很短,但应该很容易理解。另外,给定完整的当前代码,不需要进行循环性检查,因为在按分水岭分割之后,只剩下您要处理的对象。最后,根据到目标中心的大致距离进行简单的跟踪。这适用于整个视频,下面是两个示例:
相关问题 更多 >
编程相关推荐