python opencv SIFT不适用于8位图像(JPEG)

时间:2015-02-19 02:12:03

标签: python opencv jpeg 8-bit

我将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)”。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

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