Я просто расскажу, как это сделать, не написав полную программу. Короткий ответ: это ОЧЕНЬ возможно и относительно просто.
Шаг 1. Получите изображение с камеры
Для этого я бы рекомендовал просто использовать VideoCapture
и обрабатывать каждое поступающее изображение. Это можно сделать следующим образом:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read() # Read the current frame
Шаг 2: определение цвета (я приведу пример красного)
Для этого вам нужно будет определить некоторые границы в цветовом пространстве RGB. Для этого вам действительно нужно определить некоторые нижние и верхние границы
boundaries = [
([17, 15, 100], [50, 56, 200]),
([25, 146, 190], [62, 174, 250])
]
Это нижняя и верхняя границы двух границ. Например, ([17, 15, 100], [50, 56, 200])
говорит, что мы ищем R>=17
, B>=15
, G>=100
и R<=50
, B<=56
, G<=200
. И да, для этого используется формат RBG из-за схемы по умолчанию в OpenCV.
Шаг 3. Соберите все воедино
while True:
ret, frame = cap.read() # Read the current frame
for (lo, up) in boundaries:
lo = np.array(lo, dtype='uint8')
up = np.array(up, dtype='uint8')
# Find the colors within those boundaries in the image
mask = cv2.inRange(frame, lo, up)
out = cv2.bitwise_and(frame, frame, mask=mask)
out
теперь содержит текущий кадр, но только red
, который находится на изображении в этих границах. Затем вы можете определить, достаточно ли красного на изображении, чтобы следовать, поворачивать или что-то еще. Если вы хотите на самом деле определить, является ли это какой-то линией, вы также можете использовать findContours
, чтобы определить форму объекта, выделенного красным, а затем выяснить, является ли это линией таким образом.
person
Chrispresso
schedule
03.06.2016