2015-02-19 3 views
2

Я использовал SIFT для всех моих других 24-битных изображений JPEG без каких-либо проблем, однако 8-битный всегда дает мне следующую ошибку.python opencv SIFT не работает для 8-битных изображений (JPEG)

изображение пуста или имеет неправильную глубину (! = CV_8U) в функции сорта :: просеять :: оператор()

Кто-нибудь знает, как с этим бороться?

Вот мой код:

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) в функции резюме :: просеять :: оператор()" выскакивает.

+1

Просеивание обычно выполняется на изображениях в оттенках серого, которые являются 8 бит. может ли почтовый индекс? – chris

+0

Я только что добавил код, большое спасибо за то, что помог мне. –

ответ

1

EDIT: После ввода этого сообщения я только что увидел флаг полутоновой печати на 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 или нет, и т. д.

+0

Я снова проверил свой код. cv2.imread (infile, 0) читает изображения в шкале серого. Он работает хорошо для 24-битных изображений. Для 8-битного я даже не мог их прочитать. Все, что у меня есть, это «Нет» или «[]». –

+0

Ах, это звучит так, будто вы утверждали, что используете SIFT на 24-битных изображениях. Вы должны поделиться образцами изображений, с которыми работаете. –

+0

См. Ниже ссылку для удаления 5 изображений. Образы, с которыми у меня возникают проблемы, называются «Bosses_pay_boost_beats_workers» и «High_oil_prices_boost_BPs_profit». Еще раз спасибо. https://www.dropbox.com/s/p19v81xzdmf7gq5/sample%20images.zip?dl=0 –

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