Я только что установил python 3.6.2.
Я получил путь как
C: \ Users \ USERNAME \ AppData \ Local \ Programs \ Python \ Python36 -32 \ Scripts
blockquote>
Аналогичный вопрос уже обсуждался: Как распознать прямоугольники на этом изображении?
Что касается ваших данных, прямоугольники, которые вы пытаетесь найти, являются единственными черными объектами. Поэтому вы можете попробовать сделать пороговую бинаризацию: черные пиксели - это те, у которых ВСЕ три RGB-значения меньше 40 (я нашел это эмпирически). Эта простая операция делает вашу картинку выглядящей следующим образом:
После этого вы можете применить Hough преобразование для поиска строк (обсуждалось в теме, о которой я говорил), или вы можете сделать это проще. Вычислить интегральные проекции черных пикселей на оси X и Y. (Проекция на X - это вектор x_i - количество черных пикселей так, что первая координата равна x_i). Таким образом, в качестве пиков проекций получаются возможные значения x и y. Затем просматриваются все возможные отрезки, ограниченные найденными x и y (если между (x_i, y_j) и (x_i, y_k) много черных пикселей, то, вероятно, есть линия). Наконец, составьте отрезки линий к прямоугольникам!
Вот полное решение Пайтона. Главная идея:
Вот визуализация каждого обнаруженного прямоугольного контура
Результаты
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()
Это просто моя привычка. В этих случаях это не обязательно.
-121--4998525-Это может помочь:
-121--2392174-в разделе Инструменты → Параметры → Проекты и Решения → Сборка и запуск : Подробная информация о результатах построения проекта MSBuild поле со списком. Это управляет объемом информации требуется просмотреть в окне «Output».
Блоки выглядят как растровые изображения - почему бы вам не использовать простое сопоставление шаблонов с различными шаблонами для каждого размера/цвета/ориентации блока?
Так как ваша проблема - небольшие прямоугольники, которые я начну с их удаления. Поскольку эти линии намного тоньше, чем границы прямоугольников, я бы начал с применения морфологических операций на изображении.
Используя структурный элемент, который выглядит так:
element = [ 1 1
1 1 ]
должен удалить строки, которые ширины менее двух пикселей. После удаления небольших строк в прямоугольнике алгоритм нахождения opencv, скорее всего, сделает остальную часть работы для вас.
Эрозия может быть сделана в OpenCV функцией Cverode
Я завел просто здание в моем оригинальном методе и делаю, как Роберт предложил в своем комментарии на мой вопрос. После того, как я получаю свой список прямоугольников, я тогда пробежал и рассчитал средний цвет по каждому прямоугольнику. Я проверяю, есть ли красные, зеленые и синие компоненты среднего цвета в течение 10% от серых и синих цветов прямоугольника, и если они сохраняют прямоугольник, если они не отказываются от него. Этот процесс дает мне что-то вроде этого:
из этого, он тривиален, чтобы получить нужную информацию (ориентацию, отправную точку и длину каждого прямоугольника, учитывая игровое окно как сетку 6x6).
Просто предположение: неинициализированные части строк или строковых свойств определенной длины, где № 0 не в конце?
-121--2843423-Попробуйте один из многих угловых детекторов, таких как Harris Corner Detector. Также, в целом хорошая идея, чтобы попробовать это по нескольким резолюциям: так же, как и некоторые предсылка различных увеличений. Похоже, что вы хотите, чтобы какой-то цвет преобладал квадрат, тогда вы можете подавить другие цвета, сначала используя что-то вроде cvsplit ....., а затем пороги цвета ... Так что только эта область остается ... следовать за этим с Операция обрезки ... Я думаю, что это может работать так же хорошо ....