4

他のすべての 24 ビット JPEG 画像には問題なく SIFT を使用しましたが、8 ビットの JPEG 画像では常に次のエラーが表示されます。

画像が空であるか、関数 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 に答える