Концепт
Один простой способ определить, существуют ли пересечения фигур на изображении, учитывая, что каждая форма должна быть разного цвета, вы можете определить маску для каждого цвета, а все цвета изображения замаскированы, за исключением формы с ее, определить количество контуров, найденных для контура формы.
Если обнаружено более одного контура (области, превышающей заданное значение для фильтрации шума), это означает, что контур другой фигуры пересек контур фигуры, оставляя зазоры в его контуре и, таким образом, приводя к нескольким контуры.
Код
import cv2
import numpy as np
def intersected(img, masks):
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
for lower, upper in masks:
mask = cv2.inRange(img_hsv, np.array(lower), np.array(upper))
blur = cv2.GaussianBlur(mask, (5, 5), 0)
canny = cv2.Canny(blur, 0, 0)
contours, _ = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
count = 0
for cnt in contours:
if cv2.contourArea(cnt) > 50:
cv2.drawContours(img, [cnt], -1, (0, 255, 0), 1)
cv2.imshow("Test", img)
count += 1
if count == 2:
return True
img = cv2.imread("shapes.png")
blue_mask = [1, 0, 0], [178, 255, 255]
red_mask = [0, 1, 0], [179, 254, 255]
if intersected(img, (blue_mask, red_mask)):
print("Intersection detected!")
else:
print("No intersection detected.")
Выход
Intersection detected!
Объяснение
- Импортируйте необходимые библиотеки:
import cv2
import numpy as np
- Определите функцию, которая будет принимать 2 аргумента; изображение, которое мы будем определять, есть ли пересечения форм, и массив масок HSV цвета каждой формы:
def intersected(img, masks):
- Получите изображение в его форме HSV и пропустите каждую из масок HSV:
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
for lower, upper in masks:
mask = cv2.inRange(img_hsv, np.array(lower), np.array(upper))
- Размывайте маску, чтобы удалить шум, обнаруживайте ее края с помощью детектора острых краев и найдите контуры острых краев:
blur = cv2.GaussianBlur(mask, (5, 5), 0)
canny = cv2.Canny(blur, 0, 0)
contours, _ = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
- Задайте переменную
count
для хранения количества контуров с площадью больше, чем, скажем, 50
, найденных на данный момент. Если переменная count
достигнет 2
, мы узнаем, что было найдено хотя бы одно пересечение, и этого достаточно, чтобы подтвердить наличие пересечений на изображении:
count = 0
for cnt in contours:
if cv2.contourArea(cnt) > 50:
cv2.drawContours(img, [cnt], -1, (0, 255, 0), 1)
cv2.imshow("Test", img)
count += 1
if count == 2:
return True
- Наконец, мы можем использовать функцию на изображении:
img = cv2.imread("shapes.png")
blue_mask = [1, 0, 0], [178, 255, 255]
red_mask = [0, 1, 0], [179, 254, 255]
if intersected(img, (blue_mask, red_mask)):
print("Intersection detected!")
else:
print("No intersection detected.")
person
Ann Zen
schedule
21.04.2021