2015-12-23 2 views
0

Я работаю с небольшой программой, которая будет использовать вычитание фона OpenCV + python для подсчета автомобилей. Я в порядке с вычитанием фона, у меня уже есть фоновое изображение. Но когда я использую cv2.findContours(fgmask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE), у меня слишком много контуров. Хотя я могу сделать базовую фильтрацию, проверив область контура (cv2.contourArea(contour)), как показано в http://www.pyimagesearch.com/2015/05/25/basic-motion-detection-and-tracking-with-python-and-opencv/, не все автомобили обнаружены.OpenCV Python: cv2.findContours Возвращает ко многим контурам

Я также посмотрел cv2.groupRectangles(rectList, minNum[, eps]), но я не могу создать вектор прямоугольников (кстати, это http://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html, последняя функция).

Мой код, чтобы найти контуры/рисования прямоугольников:

contours, im2 = cv2.findContours(fgmask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 
for cnt in contours: 
    if MAXAREA >= cv2.contourArea(cnt) >= MINAREA: 
     rect = cv2.minAreaRect(cnt) 
     points = cv2.cv.BoxPoints(rect) 
     cv2.rectangle(img, (int(points[1][0]), int(points[1][1])), (int(points[3][0]), int(points[3][1])), (0, 255, 0), 2) 

(MINAREA и MAXAREA максимальные и минимальные площади для контура, который можно сделать)

Мой вопрос: Как я могу либо групповые прямоугольники или использовать некоторые критерии для рисования правильных прямоугольников (и чтобы автомобили не были распознаны)?

Любая помощь очень ценится.

+0

несколько примеров изображений помогут – Miki

+0

@Miki [background image] (https://drive.google.com/file/d/0B7zZpun7melFOFdTZU5adkNNOE0/view?usp=sharing) и [тестовый кадр] (https: // диск .google.com/файл/d/0B7zZpun7melFUWdMUGxYVzVMenc/вид? УСП = обмен) – DCPY

+0

пост fgmask пожалуйста – Micka

ответ

2

Как я понял вопрос. Вам нужно определить прямоугольную форму (автомобиль в фактическом изображении) из изображения. Независимо от размера. Функция minAreaRect будет соответствовать минимальному прямоугольнику прямоугольника по всем контурам, заданным для it.This способ u не может идентифицировать форму прямоугольника. Но вы можете взять этот минимальный прямоугольник в качестве шаблона для каждого контура и сопоставить его с этим конкретным контуром. На основе совпадающего балла вы можете решить, прямоугольная форма или нет. Еще одно вы можете попробовать How to detect simple geometric shapes using OpenCV.

+0

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

+0

У меня возникла проблема с несколькими контурами, когда я использовал определение canny edge.then, я взял только контур родительского контура из нескольких контуров этого конкретного объекта. Если вы столкнулись с той же проблемой, вы также можете использовать тот же метод. Если вы проверьте иерархию этого конкретного контура. Вы можете узнать, является ли он родительским или нет. Обратитесь к этому для лучшего понимания иерархии. http://docs.opencv.org/master/d9/d8b/tutorial_py_contours_hierarchy.html#gsc.tab=0 – Jijeesh

+0

Как вы назвали cv2.findContours? Какие флаги вы использовали? Вы даже использовали Python? – DCPY