2016-03-29 4 views
3

Я работаю над проектом, в котором я должен обнаружить светофоры (круги, очевидно). Теперь я работаю с образцом, который я взял с места, однако после всех моих усилий я не могу получить код, чтобы определить правильный круг (свет).Преобразование hough не обнаруживает правильный круг

Вот код: -

# 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) 

Изображение, в котором я хочу, чтобы обнаружить circle- Image. The circle I wanna detect is highlighted.

Это то, что выходное изображение: - Output Image.

I попытался сыграть с значениями радиуса размытия Гаусса и параметром minDist в преобразовании hough, но не получил большого успеха.
Может ли кто-нибудь указать мне в правильном направлении?

P.S- Некоторые из проблемных вопросов, но важных для моего проекта -
1. Мой компьютер занимает около 6-7 секунд, чтобы отобразить окончательное изображение. Мой код плохой или мой компьютер? Мои спецификации - Intel i3 M350 2,6 ГГц (первый генератор), 6 ГБ оперативной памяти, Intel HD Graphics 1000 1625 МБ.
2. Будет ли преобразование hough работать с двоичным пороговым изображением напрямую?
3. Будет ли этот код работать достаточно быстро на малине Pi 3 в реальном времени? (Я должен установить его на движущийся автономный робот.)

Спасибо!

+0

Если на вашем рабочем столе для просмотра ** ONE ** требуется 6-7 секунд, как вы ожидаете, что он будет работать на гораздо более светлой малине в реальном времени, возможно, сделав 10 снимков в секунду? Поэтому вам, вероятно, нужно оптимизировать. – JeD

+0

Это может быть быстрее на малине, так как вам не нужно рисовать круги, но все же – JeD

+0

Нет ничего плохого в вашем компьютере, и ваш код, вероятно, в порядке. Преобразование Hough занимает много времени. Если вы посмотрите на [что это делает под капотом] (https://en.wikipedia.org/wiki/Hough_transform), это будет иметь смысл, почему. Это никогда не предназначалось для фильтрации в реальном времени. И да, вы должны применить его к двоичному пороговому изображению напрямую. –

ответ

2

Прежде всего, вы должны немного ограничить свои параметры.

Пожалуйста, обратитесь к: http://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html#houghcircles

По крайней мере, набор разумных значений для минимального и максимального радиуса. Попытайтесь сначала найти этот один круг. Если вам удастся увеличить допуск радиуса.

Преобразование Hough - это метод грубой силы. Он попытается использовать любой возможный радиус для каждого пикселя края изображения. Вот почему он не очень подходит для приложений реального времени. Особенно, если вы не предоставляете правильные параметры и ввод. У вас нет пределов радиуса atm. Таким образом, вы будете вычислять сотни, если не тысячи кругов для каждого пикселя ...

В вашем случае светофор также не очень круглый, поэтому накопленный результат будет не очень хорошим. Попробуйте найти сильно насыщенные, яркие, компактные капли разумного размера. Он должен быть более быстрым и надежным.

Вы можете уменьшить время обработки, если ограничить размер изображения. Думаю, вы можете предположить, что светофор всегда будет в верхней половине вашего изображения. Так опустите нижнюю половину. Светофоры всегда будут зелеными, красными или желтыми. Удалите все, что не такого цвета ... Я думаю, вы поняли, что я имею в виду ...

+0

Umm действительно, ulitmatly этот код применяется к двоичному пороговому изображению, которое отфильтровывает все объекты, которые являются такими же красными, как и индикатор трафика, поэтому я думаю, что рабочая нагрузка будет меньше.Более того, есть способ вычислить радиус окружности в изображении, чтобы я мог получить приблизительную оценку диапазона минимального и максимального радиуса. Как насчет управления параметрами преобразования hough с помощью трекбара? Не могли бы вы показать мне пример? Я знаю, как сделать трек-бэк, но я не знаю, как управлять параметрами функции с ним ... –

+0

@YaddyVirus использует некоторый инструмент обработки изображений, такой как ImageJ или Gimp, для измерения радиуса некоторых типичных светофоров. Его половина ширины в пикселях. Затем добавьте разумный допуск, чтобы вы всегда находили свой светофор, но пропустили вычисления для слишком маленьких и слишком больших кандидатов в круг. – Piglet

0

Другое ограничение: принимать только круги, где внутренний цвет является однородным. Это выкинет все ложные удары в приведенном выше примере ,

+0

Хм хороший. Как его реализовать? @Mark –

+0

http://www.pyimagesearch.com/2014/07/07/color-quantization-opencv-using-k-means-clustering/ Этот сайт в целом отлично подходит для учебных пособий по CV. – Mark

+0

Вот где я получил этот урок от ...: P –

2

Я думаю, что вы должны сначала выполнить цветную сегментацию на основе цветов стоп-сигналов. Это значительно уменьшит рентабельность инвестиций. Затем вы можете применить преобразование Hough только для границ ROI (потому что вы хотите контур).

+1

hmmm Я обязательно попробую. –