Я строю простой проект в 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.
если «img1» является цветным изображением, он имеет 3 канала, поэтому ваша маска заканчивается типом 'CV_8UC3', потому что вы используете' img1.shape', что-то вроде '[rows, cols, 3]'. Вам нужно создать маску одного канала. – Miki
Я также использовал двоичную маску, созданную другим методом, и предположил, что это [rows, cols, 1], но благодаря вашему ответу я узнал, что где-то по пути он преобразуется в трехканальное изображение. Спасибо! И жаль неприятностей (все еще пытаясь выяснить тип управления в Python). Есть ли способ принять ваш комментарий в качестве ответа? – m3h0w
Рад, что это помогло. Просто напишите ответ самостоятельно с правильным кодом и объяснением – Miki