为什么 SIFT 不适用于带有 Python 的 OpenCV 中的 8 位图像 (JPEG)?
Why doesn't SIFT work for 8 bit images (JPEG) in OpenCV with Python?
我对所有其他 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)
然后弹出错误"image is empty or has incorrect depth (!=CV_8U) in function cv::SIFT::operator ()"。
编辑:输入后我刚刚在 imread
上看到灰度标志。尝试打印读入的图像,听起来 imread
可能无声无息地失败并留下空垫子。
cv2.SIFT.detectAndCompute
除了 8 位灰度之外,什么都不做,所以我不确定您是否真的在 24 位图像上使用 SIFT 没有问题。
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 原件等。
我在 this Whosebug post.
中回答了另一个用户在深入使用 cv2.SIFT().detectAndCompute()
时遇到同样的错误
筛选函数(至少具体 .detectAndCompute()
)
只接受具有 8 位整数值的图像。
在图像上使用 sift 之前,使用类似
的方法将其转换为 8 位
image8bit = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype('uint8')
我对所有其他 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)
然后弹出错误"image is empty or has incorrect depth (!=CV_8U) in function cv::SIFT::operator ()"。
编辑:输入后我刚刚在 imread
上看到灰度标志。尝试打印读入的图像,听起来 imread
可能无声无息地失败并留下空垫子。
cv2.SIFT.detectAndCompute
除了 8 位灰度之外,什么都不做,所以我不确定您是否真的在 24 位图像上使用 SIFT 没有问题。
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 原件等。
我在 this Whosebug post.
中回答了另一个用户在深入使用cv2.SIFT().detectAndCompute()
时遇到同样的错误
筛选函数(至少具体 .detectAndCompute()
)
只接受具有 8 位整数值的图像。
在图像上使用 sift 之前,使用类似
的方法将其转换为 8 位
image8bit = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype('uint8')