3

我正在做一个项目,我必须检测交通信号灯(显然是圆圈)。现在,我正在处理从某个地点拾取的示例图像,但是经过我所有的努力,我无法获得检测正确圆圈(光)的代码。

这是代码: -

# import the necessary packages  
import numpy as np  
import cv2

image = cv2.imread('circleTestsmall.png')
output = image.copy()
# Apply Guassian Blur to smooth the image
blur = cv2.GaussianBlur(image,(9,9),0)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
# detect circles in the image
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.2, 200)

# ensure at least some circles were found
if circles is not None:
    # convert the (x, y) coordinates and radius of the circles to integers
    circles = np.round(circles[0, :]).astype("int")

# loop over the (x, y) coordinates and radius of the circles
for (x, y, r) in circles:
    # draw the circle in the output image, then draw a rectangle
    # corresponding to the center of the circle
    cv2.circle(output, (x, y), r, (0, 255, 0), 4)
    cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)

# show the output image
cv2.imshow("output", output)
    cv2.imshow('Blur', blur)
cv2.waitKey(0)

我要检测圆圈的图像- 图片。 我要检测的圆圈突出显示。

这是输出图像的内容:- 输出图像。

我尝试在霍夫变换中使用高斯模糊半径值和 minDist 参数,但没有取得太大的成功。
谁能指出我正确的方向?

PS- 一些题外话但对我的项目至关重要的问题-
1. 我的电脑大约需要 6-7 秒才能显示最终图像。是我的代码坏了还是我的电脑坏了?我的规格是 - Intel i3 M350 2.6 GHz(第一代)、6GB RAM、Intel HD Graphics 1000 1625 MB。
2. 霍夫变换会直接作用于二值阈值图像吗?
3. 这段代码在 Raspberry Pi 3 上的运行速度是否足够快以达到实时性?(我必须将它安装在移动的自主机器人上。)

谢谢!

4

3 回答 3

2

首先,您应该稍微限制您的参数。

请参考:http ://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html#houghcircles

至少为最小和最大半径设置合理的值。首先尝试找到一个特定的圆圈。如果你成功增加你的半径公差。

霍夫变换是一种蛮力方法。它将为图像中的每个边缘像素尝试任何可能的半径。这就是为什么它不太适合实时应用程序的原因。特别是如果您没有提供正确的参数和输入。你没有半径限制atm。因此,您将为每个像素计算数百甚至数千个圆圈...

在你的情况下,红绿灯也不是很圆,所以累积的结果不会很好。尝试寻找合理大小的高度饱和、明亮、紧凑的斑点。它应该更快、更健壮。

如果您限制图像大小,您可以进一步减少处理时间。我猜你可以假设红绿灯总是在你图像的上半部分。所以省略下半部分。交通灯将始终为绿色、红色或黄色。删除所有不是那种颜色的东西......我想你明白我的意思......

于 2016-03-29T13:35:02.837 回答
2

我认为您应该首先根据红绿灯颜色进行颜色分割。它将极大地降低投资回报率。然后您可以仅在 ROI 边缘应用霍夫变换(因为您需要轮廓)。

于 2016-03-29T21:45:47.660 回答
0

另一个限制:只接受内部颜色同质的圆圈。这将排除上面示例中的所有错误命中。

于 2016-03-29T15:56:39.710 回答