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-битного изображения без проблем.

cv2.SIFT.detectAndCompute

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')

Другие вопросы по тегам