我使用SIFT为我所有的其他24位JPEG图像没有任何问题,然而,8位的总是给我以下错误。
函数cv::SIFT::operator()中的图像为空或深度不正确(!= 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::SIFT::operator()中的图像为空或深度不正确(!= CV_8U)"。
2条答案
按热度按时间laawzig21#
编辑:键入此内容后,我看到
imread
上的灰度标记。尝试在读取图像时打印图像,听起来imread
可能会静默失败,并给您留下空垫。cv2.SIFT.detectAndCompute
只接受8位灰度,所以我不确定您是否真的在24位图像上使用了SIFT而没有问题。cv2.SIFT.detectAndCompute
因此,要在检测和提取之前立即更改为8位灰度:
当然,这是一个愚蠢的地方,把它,但它是由你来弄清楚,如果你需要保持BGR原件或没有,等等。
rggaifut2#
我回答了另一个用户在this stackoverflow post中深入使用
cv2.SIFT().detectAndCompute()
时遇到的相同错误。筛选函数(至少具体为
.detectAndCompute()
)仅接受具有8位整数值的图像。
在对图像使用sift之前,请使用以下命令将其转换为8位
image8bit = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype('uint8')