python opencv SIFT не работает для 8-битных изображений (JPEG)
Я использовал SIFT для всех остальных 24-битных изображений JPEG без каких-либо проблем, однако, 8-битное всегда дает мне следующую ошибку.
изображение пусто или имеет неправильную глубину (!=CV_8U) в функции cv::SIFT::operator ()
Кто-нибудь знает как с этим бороться?
Вот мой код:
import cv2
import numpy as np
import os
import glob
import scipy.cluster
os.chdir('\mydirectory')
images = []
for infile in glob.glob('./*.jpg'):
pic = cv2.imread(infile,0)
images.append(pic)
my_set = images
descriptors = np.array([])
feaL=np.array([])
for pic in my_set:
kp, des = cv2.SIFT().detectAndCompute(pic, None)
feaL=np.append(feaL,des.shape[0])
descriptors = np.append(descriptors, des)
Затем появляется ошибка "изображение пусто или имеет неправильную глубину (!=CV_8U) в функции cv::SIFT::operator ()".
1 ответ
РЕДАКТИРОВАТЬ: После ввода этого я только что увидел флаг в градациях серого на imread. Попробуйте распечатать изображения в том виде, в каком они были прочитаны. Похоже, что imread может потерпеть неудачу и оставить вас с пустыми циновками.
cv2.SIFT.detectAndCompute никогда не принимает ничего, кроме 8-битной шкалы серого, поэтому я не уверен, что вы действительно использовали SIFT для 24-битного изображения без проблем.
Python: cv2.SIFT.detectAndCompute(image, mask[, descriptors[, useProvidedKeypoints]]) → keypoints, descriptors
Таким образом, чтобы перейти к 8-битной шкале серого непосредственно перед обнаружением и извлечением:
for pic in my_set:
pic = cv2.cvtColor(pic, cv2.COLOR_BGR2GRAY)
kp, des = cv2.SIFT().detectAndCompute(pic, None)
Конечно, это глупое место, но вы должны выяснить, нужно ли вам сохранять оригиналы BGR или нет, и т. Д.
Я ответил другому пользователю, который обнаружил ту же ошибку при использовании cv2.SIFT().detectAndCompute()
подробно в этом сообщении stackru.
Функции просеивания (по крайней мере, конкретно .detectAndCompute()
)
Принимает ТОЛЬКО изображения с 8-битными целыми числами.
Перед использованием просеивания изображения преобразуйте его в 8-битное, используя что-то вродеimage8bit = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype('uint8')