Нахождение местоположения прямоугольников в изображении с OpenCV

Я только что установил python 3.6.2.

Я получил путь как

C: \ Users \ USERNAME \ AppData \ Local \ Programs \ Python \ Python36 -32 \ Scripts

14
задан Hannes Ovrén 15 January 2010 в 02:00
поделиться

6 ответов

Аналогичный вопрос уже обсуждался: Как распознать прямоугольники на этом изображении?

Что касается ваших данных, прямоугольники, которые вы пытаетесь найти, являются единственными черными объектами. Поэтому вы можете попробовать сделать пороговую бинаризацию: черные пиксели - это те, у которых ВСЕ три RGB-значения меньше 40 (я нашел это эмпирически). Эта простая операция делает вашу картинку выглядящей следующим образом:

binarized picture

После этого вы можете применить Hough преобразование для поиска строк (обсуждалось в теме, о которой я говорил), или вы можете сделать это проще. Вычислить интегральные проекции черных пикселей на оси X и Y. (Проекция на X - это вектор x_i - количество черных пикселей так, что первая координата равна x_i). Таким образом, в качестве пиков проекций получаются возможные значения x и y. Затем просматриваются все возможные отрезки, ограниченные найденными x и y (если между (x_i, y_j) и (x_i, y_k) много черных пикселей, то, вероятно, есть линия). Наконец, составьте отрезки линий к прямоугольникам!

15
ответ дан 1 December 2019 в 10:18
поделиться

Вот полное решение Пайтона. Главная идея:

<час>

Вот визуализация каждого обнаруженного прямоугольного контура

enter image description here

Результаты

enter image description here

import cv2

image = cv2.imread('1.png')
blur = cv2.pyrMeanShiftFiltering(image, 11, 21)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.015 * peri, True)
    if len(approx) == 4:
        x,y,w,h = cv2.boundingRect(approx)
        cv2.rectangle(image,(x,y),(x+w,y+h),(36,255,12),2)

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()
0
ответ дан 1 December 2019 в 10:18
поделиться

Это просто моя привычка. В этих случаях это не обязательно.

-121--4998525-

Это может помочь:

в разделе Инструменты Параметры Проекты и Решения Сборка и запуск : Подробная информация о результатах построения проекта MSBuild поле со списком. Это управляет объемом информации требуется просмотреть в окне «Output».

-121--2392174-

Блоки выглядят как растровые изображения - почему бы вам не использовать простое сопоставление шаблонов с различными шаблонами для каждого размера/цвета/ориентации блока?

3
ответ дан 1 December 2019 в 10:18
поделиться

Так как ваша проблема - небольшие прямоугольники, которые я начну с их удаления. Поскольку эти линии намного тоньше, чем границы прямоугольников, я бы начал с применения морфологических операций на изображении.

Используя структурный элемент, который выглядит так:

 element = [ 1 1
             1 1 ]

должен удалить строки, которые ширины менее двух пикселей. После удаления небольших строк в прямоугольнике алгоритм нахождения opencv, скорее всего, сделает остальную часть работы для вас. Эрозия может быть сделана в OpenCV функцией Cverode

2
ответ дан 1 December 2019 в 10:18
поделиться

Я завел просто здание в моем оригинальном методе и делаю, как Роберт предложил в своем комментарии на мой вопрос. После того, как я получаю свой список прямоугольников, я тогда пробежал и рассчитал средний цвет по каждому прямоугольнику. Я проверяю, есть ли красные, зеленые и синие компоненты среднего цвета в течение 10% от серых и синих цветов прямоугольника, и если они сохраняют прямоугольник, если они не отказываются от него. Этот процесс дает мне что-то вроде этого:

screenshot

из этого, он тривиален, чтобы получить нужную информацию (ориентацию, отправную точку и длину каждого прямоугольника, учитывая игровое окно как сетку 6x6).

6
ответ дан 1 December 2019 в 10:18
поделиться

Просто предположение: неинициализированные части строк или строковых свойств определенной длины, где № 0 не в конце?

-121--2843423-

Попробуйте один из многих угловых детекторов, таких как Harris Corner Detector. Также, в целом хорошая идея, чтобы попробовать это по нескольким резолюциям: так же, как и некоторые предсылка различных увеличений. Похоже, что вы хотите, чтобы какой-то цвет преобладал квадрат, тогда вы можете подавить другие цвета, сначала используя что-то вроде cvsplit ....., а затем пороги цвета ... Так что только эта область остается ... следовать за этим с Операция обрезки ... Я думаю, что это может работать так же хорошо ....

0
ответ дан 1 December 2019 в 10:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: