Цвета — важная часть жизни, и разве не удивительно знать, что теперь у нас есть машина, чтобы увидеть, присутствует ли определенный цвет в изображении или нет. Также мы можем использовать машину t, чтобы угадать, присутствует ли цвет в живом видео или нет, и в сегодняшнем блоге мы увидим, как мы можем это сделать.
Давайте погрузимся прямо в это.
Сначала мы установим все необходимое с помощью команды, приведенной ниже.
pip install opencv-contrib-python pip install numpy
Если numpy не устанавливается с помощью первой команды, вы также можете написать вторую команду.
Теперь импортируем самое необходимое в наш основной файл Python.
import cv2 import numpy as np
Инициализация нашей камеры для захвата живого видео с помощью модуля VideoCapture, доступного в openCV.
cap = cv2.VideoCapture(0)
Теперь запустите цикл, который будет захватывать видео.
Теперь делаем каждый кадр, который будем анализировать с помощью нашей камеры. У нас также есть «_», который говорит, что нам не нужна переменная, мы просто хотим иметь для нее значение. Кадры считываются с заголовком функции чтения. «_» обычно имеет логическое значение, которое используется для определения того, есть ли у нас захват или нет. Кадры в основном представляют собой комбинацию пикселей в виде массивов numpy.
_, frame = cap.read() frame=np.flip(frame,axis=1)
Теперь мы будем конвертировать кадры в формат HSV из исходного цветового формата.
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
Далее мы будем определять диапазон цвета, который мы хотим проанализировать. Мы установим верхнюю границу и нижнюю границу цвета.
lower_blue = np.array([110,50,50]) upper_blue = np.array([130,255,255])
Фиксация порога изображения HSV, чтобы получить только синие цвета.
mask = cv2.inRange(hsv, lower_blue, upper_blue)
Приведенная выше строка кода проверит, находятся ли следующие изображения HSV в диапазоне или нет.
Далее мы будем использовать morphologyEx, который поможет нам в выполнении некоторых операций с обнаруженным цветом.
mask_all=cv2.morphologyEx(mask,cv2.MORPH_DILATE, np.ones((3,3),np.uint8))
Я взял маску, которую мы получили после проверки, функцию MORPH, которая используется для извлечения определенной вещи из изображения, и массивы всех единиц.
Далее мы будем выполнять двухбитовую операцию над маской, которую мы получили.
mask2=cv2.bitwise_not(mask) streamA = cv2.bitwise_and(frame,frame, mask= mask2)
Первая операция берет маску, полученную нами выше, и передает ее оператору bitwise_not. Поскольку маска имеет форму массива numpy, мы можем выполнить над ней побитовую операцию. Следующая операция берет полученную маску2 и выполняет побитовую операцию _and над кадрами и маской2.
Далее мы найдем точки маски, что означает точки, в которых присутствует цвет.
points = cv2.findNonZero(mask)
Он возвращает нам точку, где значения не равны нулю. Я верну нам вывод json.
Затем возьмите среднее значение этих точек с помощью функции среднего значения numpy и распечатайте точки.
avg = np.mean(points, axis=0) print(points)
Затем мы нарисуем прямоугольник, если это возможно, в точках, которые, как мы выяснили, не равны нулю.
cv2.rectangle(streamA,(points[0][0][0],points[0][0][1]),(700,700),(255,0,0),2)
Функция Rectangle содержит поток A, который мы получили после последней побитовой операции, начальные координаты из вывода json, которые мы получили из точек, конечные координаты (700,700), цвет и толщину линий прямоугольника. .
cv2.rectangle(streamA,(points[0][0][0],points[0][0][1]),(700,700),(255,0,0),2)
Теперь показываем окончательный результат с помощью метода imshow.
cv2.imshow('frame',streamA)
Наконец, устанавливаем способ, с помощью которого мы можем остановить показ живого видео после нажатия клавиши.
k = cv2.waitKey(5) & 0xFF if k == 27: break
Это в основном вырывает нас из цикла while, который мы начали выше.
Наконец, уничтожение всех окон, которые были созданы в этом процессе.
cv2.destroyAllWindows()
Полный код, который я использовал выше, приведен ниже для лучшего просмотра.
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
background=0
while(1): # Take each frame
_, frame = cap.read()
frame=np.flip(frame,axis=1)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue) mask=cv2.morphologyEx(mask,cv2.MORPH_OPEN,np.ones((3,3),np.uint8)) mask_all=cv2.morphologyEx(mask,cv2.MORPH_DILATE,np.ones((3,3),np.uint8)) mask2=cv2.bitwise_not(mask) streamA = cv2.bitwise_and(frame,frame, mask= mask2) points = cv2.findNonZero(mask) avg = np.mean(points, axis=0) print(points) cv2.rectangle(streamA,(points[0][0][0],points[0][0][1]),(700,700),(255,0,0),2) cv2.imshow('frame',streamA) k = cv2.waitKey(5) & 0xFF if k == 27: break cv2.destroyAllWindows()
Я также прикрепил репозиторий github для лучшего просмотра кода. У него также есть другой метод, который можно использовать для поиска цвета, но единственная разница в том, что этот код маскирует желаемый цвет здесь синим, но этот код покажет только желаемый цвет, остальное весь код будет замаскирован.