2017-02-14 3 views
1

Для школьного проекта я пытаюсь распознать форму шестиугольника в видеозахвате с использованием python и opencv. Проблема в том, что когда я использую этот код, он никогда не находит шестиугольник. Я не нашел причины, почему он не работает, поэтому я надеюсь, что кто-то может мне помочь.python opencv shape detection

Код:

import numpy as np 
import cv2 

stop_cascade = cv2.CascadeClassifier('cascade.xml') 

cap = cv2.VideoCapture(0) 

while(True): 
    ret, img = cap.read() 
    lower = np.array([0,0,0]) 
    upper = np.array([20,20,20]) 
    mask = cv2.inRange(img, lower, upper) 
    contours, h = cv2.findContours(mask, 1, 2) 
    contours.sort(key = len) 

    for contour in contours[-3:]: 
     approx = cv2.approxPolyDP(contour,0.1*cv2.arcLength(contour,True),True) 
     if len(approx) == 6: 
      print "hexagon" 

    cv2.imshow('image', mask) 

    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 

cap.release() 
cv2.destroyAllWindows() 

Заранее спасибо

Edit: Чтобы быть немного более конкретными. Я пробовал размывать разные шестиугольники, но когда я печатаю len (approx), он никогда не выше 4. Является ли это ошибкой в ​​моем объекте или это то, что у меня есть ошибка в поиске контуров, о которых я не знаю?

+0

Что вы на самом деле отлаживали вашу программу, вместо того, чтобы сказать «Я не нашел причины, почему она не работает, поэтому я надеюсь, что кто-то может мне помочь?» Пожалуйста, укажите * конкретный * вопрос, а не «пожалуйста, отлаживайте это ...» – blacksite

+0

Прошу прощения за то, что вы недостаточно конкретно. То, что я сделал для отладки кода, содержит разные формы шестиугольника перед камерой, в то время как программа печатала len (приблизительно), но никогда не показывала число выше, чем 4. Я эта проблема из-за моих объектов (гексон образное изображение на бумаге), или это я виноват в поиске контуров? – Nerdeose

+0

Можете ли вы приложить образец ввода? – ZdaR

ответ

0

Похоже, ваша программа упрощает контур за пределами того, что вы хотели бы. Таким образом, approxPolyDP дополнительно упрощает ваш шестиугольник квадрату или треугольнику. Это также объясняет, почему len (приблизительно) никогда не возвращает значение больше 4. Попробуйте изменить значение epsilon, которое вы переходите на approxPolyDP. Эти изменения, которые я предлагаю:

  1. Попробуйте диапазон значений для эпсилона в approxPolyDP. Измените коэффициент умножения на 0.1*cv2.arcLength(contour,True) от 0,01 до 0,1
  2. Используйте drawContours, чтобы фактически отобразить приблизительно кривая. Это поможет вам выбрать лучший коэффициент умножения

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