我使用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)
然后弹出错误 "image is empty or has incorrect depth (!=CV_8U) in function cv::SIFT::operator ()"。
EDIT: 在打完这个字后,我才看到灰度标志在这里。imread
. 试着打印图片,因为它们是读进去的,这听起来像是 imread
可能会默默地失败,让你与空松。
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()
深入 这个stackoverflow的帖子.
筛选功能(至少特别是 .detectAndCompute()
) 只接受8位整数值的图像。
在对图像使用 sift 之前,使用类似于 image8bit = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype('uint8')