2017-02-20 37 views
1

Я строю простой проект в Python3, используя OpenCV3, пытаясь совместить кусочки головоломки с «законченным» изображением головоломки. Я начал тесты с помощью SIFT.Обнаружение функций OpenCV Python: как обеспечить маску? (SIFT)

Я могу извлечь контур головоломки и обрезать изображение, но поскольку большинство высоких частот находятся, конечно, вокруг куска (где заканчивается кусок и начинается пол), я хочу передать маску метод SIFT detectAndCompute(), заставляя алгоритм искать ключевые точки только внутри куска.

test_mask = np.ones(img1.shape, np.uint8) 
kp1, des1 = sift.detectAndCompute(img1, mask = test_mask) 

После прохождения тест-маски (чтобы убедиться, что это uint8), я получаю следующее сообщение об ошибке:

kp1, des1 = sift.detectAndCompute(img1,mask = test_mask) cv2.error: /home/pyimagesearch/opencv_contrib/modules/xfeatures2d/src/sift.cpp:772: error: (-5) mask has incorrect type (!=CV_8UC1) in function detectAndCompute

Из моего исследования, uint8 это просто псевдоним для CV_8U, который является таким же, как CV_8UC1. Не удалось найти образец кода, передающий маску для любого алгоритма обнаружения признаков в Python.

+0

если «img1» является цветным изображением, он имеет 3 канала, поэтому ваша маска заканчивается типом 'CV_8UC3', потому что вы используете' img1.shape', что-то вроде '[rows, cols, 3]'. Вам нужно создать маску одного канала. – Miki

+0

Я также использовал двоичную маску, созданную другим методом, и предположил, что это [rows, cols, 1], но благодаря вашему ответу я узнал, что где-то по пути он преобразуется в трехканальное изображение. Спасибо! И жаль неприятностей (все еще пытаясь выяснить тип управления в Python). Есть ли способ принять ваш комментарий в качестве ответа? – m3h0w

+0

Рад, что это помогло. Просто напишите ответ самостоятельно с правильным кодом и объяснением – Miki

ответ

1

Благодаря Мики мне удалось найти ошибку.

Оказалось, что моя оригинальная маска, которую я создал с использованием пороговых операций, хотя и выглядела двоичной, представляла собой 3-канальное изображение ([rows], [cols], 3). Таким образом, он не может быть принят в качестве маски.

После проверки типа и формы (должно быть uint8 и [строки, смещ_по_столбцы, 1]):

print(mask.dtype) 
print(mask.shape) 

Преобразовать маску серой, если он все еще 3-канальный:

mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)