Вместо выполнения установки порогового значения для изображения в градациях серого можно выполнить настройку порогового значения для цветного изображения с помощью cv2.inRange
.Вы можете установить верхнюю и нижнюю границы допустимых цветов, чтобы включить пронумерованные плитки, но исключить пустые плитки и края.
Кроме того, я предполагаю, что шаг, на котором вы проверяете if len(cnt) == 4:
, состоит в том, чтобы вернуть только квадратные контуры,Однако изменение размера может привести к тому, что контуры будут не совсем квадратными для плиток, и не пройдут эту проверку.Вместо этого вы можете получить внешние контуры плиток, изменив второй вход findContours
на 0 (contours = cv2.findContours(thresh, 0, 2)[1]
), который устанавливает режим поиска на cv2.RETR_EXTERNAL
.
Здесьэто код с внесенными изменениями и соответствующие верхние и нижние границы цвета для предоставленного вами примера изображения.
import cv2
import mss
import time
import numpy as np
# Static screenshot for board
monitor = {"top": 135, "left": 425, "width": 500, "height": 500}
sct = mss.mss()
# inRange bounds
lower_bound = (0, 0, 210)
upper_bound = (230, 240, 250)
# Run for a maximum of 150s or until 'q' is pressed
last_time = time.time()
while time.time() - last_time < 150:
img = np.asarray(sct.grab(monitor))[:,:,:3]
resized_img = cv2.resize(img, (100, 100))
mask = cv2.inRange(resized_img, lower_bound, upper_bound)
contours = cv2.findContours(mask, 0, 2)[1]
for cnt in contours:
cv2.drawContours(resized_img, [cnt], 0, (0, 255, 0), 2)
cv2.imshow("2048", resized_img)
if cv2.waitKey(25) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
Вот созданное выходное изображение:
Редактировать: Вот код для непосредственного использования примера изображения:
import cv2
import numpy as np
img = cv2.imread('2048.jpg')
resized_img = cv2.resize(img, (100, 100))
lower_bound = (0,0,210)
upper_bound = (230,240,250)
mask = cv2.inRange(resized_img, lower_bound, upper_bound)
contours = cv2.findContours(mask, 0, 2)[1]
for cnt in contours:
cv2.drawContours(resized_img, [cnt], 0, (0, 255, 0), 2)
cv2.imshow('2048', resized_img)
cv2.waitKey(0)