4

我对所有其他 24 位 JPEG 图像都使用了 SIFT,没有任何问题,但是,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)”。

4

2 回答 2

3

编辑:输入此内容后,我刚刚看到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 原件等。

于 2015-02-19T07:57:17.690 回答
1

我回答了另一个用户,该用户在此 stackoverflow 帖子cv2.SIFT().detectAndCompute()中深入使用时遇到了相同的错误。

筛选功能(至少具体而言.detectAndCompute()
仅接受具有 8 位整数值的图像。

在图像上使用 sift 之前,使用类似的方法将其转换为 8bit
image8bit = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype('uint8')

于 2019-11-01T00:03:24.150 回答