将 OpenCV SURF 应用于 python 中的 HSV 颜色 space 时出错

Error when applying OpenCV SURF to HSV color space in python

我正在对 HSV 图像实施 SURF,但它不起作用。 当我对 RGB 图像做同样的事情时,它工作正常。

from PIL import Image
import cv2
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

#loaading image
rgb_img_arr= np.array(Image.open("myImage.jpg"))
hsv_image_arr=matplotlib.colors.rgb_to_hsv(rgb_img_arr)

surf = cv2.xfeatures2d.SURF_create()

#it works fine
keypoints, descriptors = surf.detectAndCompute(rgb_img_arr, None)
rgb_img = cv2.drawKeypoints(rgb_img_arr, keypoints, None)
plt.imshow(rgb_img )

#But it doent work
keypoints, descriptors = surf.detectAndCompute(hsv_image_arr, None)
hsv_img = cv2.drawKeypoints(hsv_image_arr, keypoints, None)
plt.imshow(hsv_img )

我得到的错误是 -

C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\surf.cpp:892: error: (-215) !_img.empty() && ((imgtype) & ((1 << 3) - 1)) == 0 && (imgcn == 1 || imgcn == 3 || imgcn == 4) in function cv::xfeatures2d::SURF_Impl::detectAndCompute

请告诉我如何解决这个问题 ?

detectAndCompute 需要 CV_8U 图片。 (imgtype) & ((1 << 3) - 1)) == 0 有点神秘,但是如果您按照错误找到来源,您可以看到那里:https://github.com/opencv/opencv_contrib/blob/2231018c839d728811a39556ec83741bf9a27614/modules/xfeatures2d/src/surf.cpp#L892

HSV 转换 matplotlib.colors.rgb_to_hsv 是 return 浮动图像。

要么将浮动图像转换回未签名图像。或者你可以直接使用OpenCV颜色转换,它会默认return一个8U的图像:

hsv_image_array = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)