Обнаружение рисунка на изображении и восстановление его положения - PullRequest
0 голосов
/ 06 февраля 2019

У меня изображение 1920x1080.Мне нужно получить местоположение для каждого прямоугольника на изображении.Желательно как 2 балла (верхний левый, нижний правый).

Я довольно новичок в Python.Я думаю о возможности использования модуля opencv, но если бы вы могли дать мне несколько советов, это было бы очень полезно.

Спасибо.

Sample Image

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Я бы рекомендовал использовать OpenCV findContours() примерно так:

#!/usr/bin/env python3

import numpy as np
import cv2

# Load image
im = cv2.imread('pattern.png')

# Convert to grayscale
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

# Find contours, draw on image and save
im2, contours, hierarchy = cv2.findContours(imgray,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(im, contours, -1, (0,0,255), 3)

# Show user what we found
i=0
for cnt in contours:
    x,y,w,h = cv2.boundingRect(cnt)
    print('Contour {}: x={}, y={}, w={}, h={}'.format(i,x,y,w,h))
    i = i+1

# Save the result
cv2.imwrite('result.png',im)

enter image description here

Пример вывода

Contour 0: x=1743, y=903, w=77, h=77
Contour 1: x=1552, y=903, w=77, h=77
Contour 2: x=291, y=903, w=77, h=77
Contour 3: x=100, y=903, w=77, h=77
Contour 4: x=1648, y=808, w=77, h=77
Contour 5: x=196, y=808, w=77, h=77
Contour 6: x=1743, y=712, w=77, h=77
Contour 7: x=291, y=712, w=77, h=77
Contour 8: x=100, y=712, w=77, h=77
Contour 9: x=1551, y=711, w=78, h=78
Contour 10: x=1017, y=597, w=77, h=77
Contour 11: x=826, y=597, w=77, h=77
Contour 12: x=922, y=502, w=77, h=77
Contour 13: x=1017, y=406, w=77, h=77
Contour 14: x=826, y=406, w=77, h=77
Contour 15: x=1743, y=291, w=77, h=77
Contour 16: x=1552, y=291, w=77, h=77
Contour 17: x=291, y=291, w=77, h=77
Contour 18: x=100, y=291, w=77, h=77
Contour 19: x=1648, y=196, w=77, h=77
Contour 20: x=196, y=196, w=77, h=77
Contour 21: x=1743, y=100, w=77, h=77
Contour 22: x=1552, y=100, w=77, h=77
Contour 23: x=291, y=100, w=77, h=77
Contour 24: x=100, y=100, w=77, h=77

Обратите внимание, что это не ищет ваши шаблоны специально, это просто ищет белые объекты на черном фоне.Это имеет свои преимущества и недостатки.Преимущество состоит в том, что он будет работать для любой белой фигуры (круги, звезды, восьмиугольники) без изменения кода.Это также, вероятно, быстрее, чем сопоставление с шаблоном.Недостатком является то, что он даст вам ложные срабатывания, если на вашем изображении есть другие белые объекты - хотя вы можете проверить форму, округлость, цвет или что-либо еще, чтобы подтвердить / устранить неоднозначность.

0 голосов
/ 06 февраля 2019

Ключевые слова, которые вы ищете, соответствуют шаблону.Он в основном ищет целое изображение для копий «шаблона».Другими словами, именно то, что вы ищете!

Некоторые примеры кода можно найти здесь: https://docs.opencv.org/3.3.0/d4/dc6/tutorial_py_template_matching.html

import cv2
import numpy as np
from matplotlib import pyplot as plt

img_rgb = cv2.imread('mario.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.png',0)

w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)

for pt in zip(*loc[::-1]):
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)

cv2.imwrite('res.png',img_rgb)

Где mario_coin.png - ваш прямоугольник, а mario.png - полноразмерное изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...