我将SIFT用于所有其他24位JPEG图像而没有任何问题,但是,8位一位总是给我以下错误。
图片为空或函数cv :: SIFT :: operator()
中的深度不正确(!= CV_8U)有谁知道如何处理它?</ p>
这是我的代码:
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 :: SIFT :: operator()中的深度不正确(!= CV_8U)”。
答案 0 :(得分:2)
编辑:输入后我刚看到imread上的灰度标志。尝试在读入图像时打印图像,听起来像imread可能会默默地失败并留下空垫。
cv2.SIFT.detectAndCompute从不采取8位灰度以外的任何其他内容,因此我不确定您是否确实在没有问题的情况下对24位图像使用了SIFT。
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原件等等。
答案 1 :(得分:0)
我回答了另一个在this stackoverflow post中深入使用cv2.SIFT().detectAndCompute()
时遇到相同错误的用户。
筛选功能(至少是.detectAndCompute()
)
仅接受具有8位整数值的图像。
在图像上使用sift之前,请先使用
将其转换为8bit
image8bit = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype('uint8')