2016-05-04 4 views
3

Я хотел бы создать скрипт в Python (с использованием библиотеки OpenCV), который определяет, какие маркеры находятся на картинке. Маркеры выглядеть примерно так:Обнаружение маркеров в 2D-изображении [Python/OpenCV]

Markers

После загрузки изображения, сценарий должен напечатать, какие маркеры в картинке (возврат числа маркеров). Например, если я загрузить эту картинку:

Image with markers

Для этого изображения скрипт должен возвращать три числа: 1, 2 и 3. У меня есть сценарий, который нагрузкой изображения и распознавать фигуры (круги, квадраты и т.д. . - в скрипте ниже только квадраты), но я не имею никакой идеи распознавать маркер целиком, состоящий из нескольких цифр. Есть идеи? Пожалуйста, для любых предложений по алгоритму или любому решению.

import numpy as np 
import cv2 

img = cv2.imread('B.jpg') 
gray = cv2.imread('B.jpg',0) 

ret,thresh = cv2.threshold(gray,120,255,1) 

contours,h = cv2.findContours(thresh,1,2) 

for cnt in contours: 
    approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True) 
    print len(approx) 
    if len(approx)==4: 
     print "square" 
     cv2.drawContours(img,[cnt],0,(0,0,255)) 

cv2.imshow('img',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Но, очевидно, это не то, что мне нужно, оно окружает только прямоугольники. Спасибо за любые советы и помощь.

+1

1. найти внешние контуры. 2. выберите ограничивающий бокс для каждого контура (который должен быть идентичен контуру, поскольку внешние контуры в ваших изображениях квадраты). 3. измените размер изображения так, чтобы он имел тот же размер, что и ваши ссылочные маркеры. 4. Используйте привязку фаски на изображении canny edge измененной области изображения и меток. 5. Если одно совпадение фаски является достаточно большим, выберите самый маленький из них, как обнаруженный маркер – Micka

+1

, если у вас есть дополнительные искажения перспективы, вы должны найти квадрациклы вместо ограничивающих боксов и использовать перспективное деформирование. – Micka

+1

Я бы, вероятно, попробовал сопоставление функций, как описано здесь http://docs.opencv.org/3.1.0/d1/de0/tutorial_py_feature_homography.html#gsc.tab=0, но я не получил его работу. Также посмотрите этот пост: http://stackoverflow.com/questions/20259025/module-object-has-no-attribute-drawmatches-opencv-python – tfv

ответ

0

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

Markers

Теперь я попытаюсь использовать алгоритм по @Micka, но у меня есть проблема со второй и третьей точкой. Код в моем посте выше найдет квадраты. Как сохранить новые прямоугольники в качестве новых изображений?

enter image description here

Смежные вопросы