为什么SIFT在OpenCV with Python中不能用于8位图像(JPEG)?

bn31dyow  于 2023-02-13  发布在  Python
关注(0)|答案(2)|浏览(156)

我使用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)"。

laawzig2

laawzig21#

编辑:键入此内容后,我看到imread上的灰度标记。尝试在读取图像时打印图像,听起来imread可能会静默失败,并给您留下空垫。

cv2.SIFT.detectAndCompute只接受8位灰度,所以我不确定您是否真的在24位图像上使用了SIFT而没有问题。
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原件或没有,等等。

rggaifut

rggaifut2#

我回答了另一个用户在this stackoverflow post中深入使用cv2.SIFT().detectAndCompute()时遇到的相同错误。
筛选函数(至少具体为.detectAndCompute()

仅接受具有8位整数值的图像。

在对图像使用sift之前,请使用以下命令将其转换为8位
image8bit = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype('uint8')

相关问题