@kr_ilya

Определение количества квадратов с пересечением?

Нужно найти количество квадратов с пересечением на картинке.
Сейчас есть такой код:
import cv2
import numpy as np

img = cv2.imread('./task1.bmp', cv2.IMREAD_UNCHANGED)

#convert img to grey
img_grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#set a thresh
thresh = 100
#get threshold image
ret,thresh_img = cv2.threshold(img_grey, thresh, 255, cv2.THRESH_BINARY)
#find contours
contours, hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# print(len(contours))
#create an empty image for contours
img_contours = np.zeros(img.shape)
# draw the contours on the empty image
cv2.drawContours(img_contours, contours, -1, (0,255,0), 3)
#save image
cv2.imwrite('./res.bmp',img_contours)

Исходная картинка:
60d9851782dd9066521901.png

Результат после обработки
60d9854630c1b340310064.png

Как видно квадраты на картинках пересекаются и программа находит их общие контуры. Надо, что бы программа находила именно контуры квадратов и подсчитывала их.
  • Вопрос задан
  • 127 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Vindicar
Размер квадрата известен? Используй скользящее окно.
Вырезай поочерёдно все фрагменты изображения такого размера, если оно целиком чёрное - то фиксируем квадрат в этой позиции.

Могут быть ложные срабатывания, если два перекрывающихся квадрата расположены идеально на одной вертикали/горизонтали. Тут нужно искать все срабатывания в этой области, и выбирать крайнее левое/правое или нижнее/верхнее.
Ответ написан
@U235U235
Делается все буквально за три команды.
1. Закрытие с помощью cv2.morphologyEx, ядро квадратное, размерами в 2 раза меньше квадратов. Удаляются одиночные квадраты.
2. инверсия. cv2.bitwise_not
3. cv2.connectedComponents подсчет оставшихся объединенных квадратов.
Если надо выделить отдельные квадраты в объединении, то используйте после п.1 cv2. matchTemplate
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы