Как запустить распознавание нескольких цветов с помощью пользовательского ввода? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть школьный проект, в котором я должен сделать линию, следующую за машиной, которая должна следовать определенной цветовой линии в зависимости от ввода пользователя. Код работает нормально, когда я тестирую возможности отслеживания линии автомобиля одним цветом и без ввода пользователя, но когда я добавляю несколько цветов и ввод пользователя, автомобиль больше не хочет следовать по линии и просто уезжает в закат. Я попытался поэкспериментировать с кодом, но не повезло. Это цикл while кода.

try:
    while(True):
        user = int(input("1 for blue line"))
        time.sleep(1)

        ret, frame = cap.read()

        crop_img = frame[60:120, 0:160]

        _, img = cap.read()

        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# Tracking blue color

        if user == 1:
            blue_lower = np.array([99,115,150],np.uint8)
            blue_upper = np.array([110,255,255],np.uint8)
            blue = cv2.inRange(hsv, blue_lower, blue_upper)
            kernal = np.ones((5 ,5), "uint8")
            blue=cv2.dilate(blue,kernal)
            res=cv2.bitwise_and(img, img, mask = blue)

            (contours,hierarchy)=cv2.findContours(blue,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

            for pic, contour in enumerate(contours):
                area = cv2.contourArea(contour)
                if(area>300):

                        x,y,w,h = cv2.boundingRect(contour)
                        img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

            Controls()

# Tracking black color

        else:
            black_lower = np.array([0,0,0],np.uint8)
            black_upper = np.array([50,50,100],np.uint8)
            black = cv2.inRange(hsv, black_lower, black_upper)
            kernal = np.ones((5 ,5), "uint8")
            black = cv2.dilate(black,kernal)
            res2 = cv2.bitwise_and(img, img, mask = black)

            (contours,hierarchy)=cv2.findContours(black,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

            for pic, contour in enumerate(contours):
                area = cv2.contourArea(contour)
                if(area>300):

                        x,y,w,h = cv2.boundingRect(contour)
                        img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

            Controls()

1 Ответ

0 голосов
/ 30 сентября 2019

Я подозреваю, что это связано с пользовательским вводом, хотя это зависит от того, как реализован Controls(). input() - это блокирующий вызов, означающий, что программа прекращает выполнение, пока пользователь не нажмет ввод. Итак, я думаю, что ваш код делает это: когда вы даете ввод, изображение обрабатывается, и автомобиль приводится в движение. Цель состоит в том, чтобы обработать новое изображение и изменить направление автомобиля, если это необходимо. Однако выполнение программы зависает на input(), поэтому новое изображение не обрабатывается, и автомобиль продолжает движение по прямой линии, поскольку Controls() никогда не вызывается / не изменяется.

Решение состоит в том, чтобы разместитьinput() за пределами while -цикла. Теперь машина должна снова следовать синей линии. Обратите внимание, что теперь вам придется перезапустить скрипт, чтобы следовать другому цвету.

Наконец, как комментирует @ Mark-Setchell, вы делаете свою жизнь намного проще, когда используете функции вместо того, чтобы повторять кучу кода. В вашем случае вы можете сделать функцию с нижним и верхним цветами в качестве параметров. О функциях можно узнать здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...