#python #opencv
#python #opencv #обработка изображений
Вопрос:
Я новичок в библиотеке cv2, и я хочу создать программу, которая будет определять, есть ли серый цвет в изображении в режиме реального времени. До сих пор я брал код, который покажет мне экран в режиме реального времени
import numpy as np
import cv2
import pyautogui
from mss import mss
from PIL import Image
mon = {'top': 268, 'left': 968, 'width': 931, 'height': 599}
sct = mss()
while 1:
sct.get_pixels(mon)
img = Image.frombytes('RGB', (sct.width, sct.height), sct.image)
cv2.imshow('test', np.array(img))
if cv2.waitKey(25) amp; 0xFF == ord('q'):
cv2.destroyAllWindows()
break
Но я понятия не имею, как определить, отображается ли серый цвет на экране (другие вопросы касаются того, все ли изображение серое, а не отображается ли серый цвет на экране)
Комментарии:
1. есть ли у вас конкретное, известное значение серого? вы можете искать значения rgb, которые находятся в пределах нескольких точек друг от друга
2. @TenaciousB Да, я знаю конкретное значение серого, но как мне искать значения RGB на экране, вот что я не знаю, как это сделать
3. См. cv2.inRange() для определения порогового значения цвета. Пороговое значение изображения. Затем подсчитайте количество белых пикселей или просто проверьте среднее значение. Если больше 0, в нем есть немного белого, и, следовательно, оригинал имеет серый цвет. См docs.opencv.org/4.1.1/d2/de8 /. … Затем найдите примеры на этом форуме или в Google.
4. проверьте мой ответ @avielovadiya
Ответ №1:
Лучший способ — изменить цветовое пространство на HSV и найти диапазон значений оттенка для цвета.
- Возьмите каждый кадр видео
- Преобразовать из BGR в цветовое пространство HSV
- Пороговое значение изображения HSV для диапазона синего цвета
Приведенный ниже код взят с официального сайта OpenCV для обнаружения объекта синего цвета
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
# Take each frame
_, frame = cap.read()
# Convert BGR to HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# define range of blue color in HSV
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# Threshold the HSV image to get only blue colors
mask = cv.inRange(hsv, lower_blue, upper_blue)
# Bitwise-AND mask and original image
res = cv.bitwise_and(frame,frame, mask= mask)
cv.imshow('frame',frame)
cv.imshow('mask',mask)
cv.imshow('res',res)
k = cv.waitKey(5) amp; 0xFF
if k == 27:
break
cv.destroyAllWindows()
Для обнаружения серого цвета на экране в реальном времени
диапазон будет в HSV равен
нижний цвет = np.array([0,0,0]) верхний цвет = np.array([255,10,255])
В цветовом пространстве HSV / HSL насыщенность пикселей серого цвета очень близка к нулю. Затем канал значений сообщит вам, как далеко по шкале от черного до белого они находятся на самом деле, низкая яркость / значение темно-серое, тогда как высокая яркость / значение означает светло-серый.
Итак, для серого цвета ваш код выглядит следующим образом
import numpy as np
from PIL import Image
from mss import mss
import cv2 as cv
import cv2
mon = {'top': 268, 'left': 968, 'width': 931, 'height': 599}
sct = mss()
while (1):
# Take each
sct.get_pixels(mon)
img = Image.frombytes('RGB', (sct.width, sct.height), sct.image)
img = np.array(img)
# Convert RGB to HSV
hsv = cv.cvtColor(img, cv.COLOR_RGB2HSV)
# define range of gray color in HSV
lower_gray = np.array([0, 0, 0])
upper_gray = np.array([255, 10, 255])
# Threshold the HSV image to get only gray colors
mask = cv.inRange(hsv, lower_gray, upper_gray)
# Bitwise-AND mask and original image
res = cv.bitwise_and(img, img, mask=mask)
cv.imshow('original', img)
cv.imshow('mask', mask)
cv.imshow('res', res)
k = cv.waitKey(5) amp; 0xFF
if k == 27:
break
cv.destroyAllWindows()
Следующий код можно использовать для статических изображений
import cv2
import numpy as np
image_path ="trail.jpg"
img = cv2.imread(image_path)
# Convert BGR to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# define range of gray color in HSV
lower_gray = np.array([0,0,0])
upper_gray = np.array([255,10,255])
# Threshold the HSV image to get only gray colors
mask = cv2.inRange(hsv, lower_gray, upper_gray)
# Bitwise-AND mask and original image
res = cv2.bitwise_and(img,img, mask= mask)
cv2.imwrite("output.png",res)
Комментарии:
1. Проверьте ссылку определите свой диапазон серого цвета с помощью cv2.trackbar
2. Спасибо за ответ, но вы отправляете мне код для обнаружения серого в камере, и он мне нужен на экране компьютера
3. @avielovadiya, вам нужно для изображения, которое уже захвачено
4. Последний добавленный вами раздел будет соответствовать коду определения серого цвета? что вы добавили? Потому что я хочу обнаруживать серый цвет в режиме реального времени на экране, а не только на одном изображении
5. что вы подразумеваете под экраном