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

问题描述 投票:3回答:2

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

python opencv jpeg 8-bit
2个回答
3
投票

EDIT: 在打完这个字后,我才看到灰度标志在这里。imread. 试着打印图片,因为它们是读进去的,这听起来像是 imread 可能会默默地失败,让你与空松。

cv2.SIFT.detectAndCompute

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
投票

我回答了一个不同的用户,在使用时遇到了同样的错误。cv2.SIFT().detectAndCompute() 深入 这个stackoverflow的帖子.

筛选功能(至少特别是 .detectAndCompute() ) 只接受8位整数值的图像。

在对图像使用 sift 之前,使用类似于 image8bit = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype('uint8')

© www.soinside.com 2019 - 2024. All rights reserved.