首页 > 解决方案 > 在 python 中将 OpenCV SURF 应用于 HSV 颜色空间时出错

问题描述

我正在实施SURF到 HSV 图像,但它不起作用。当我对 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: 错误:(-215) !_img.empty() && ((imgtype) & ((1 << 3) - 1 )) == 0 && (imgcn == 1 || imgcn == 3 || imgcn == 4) 在函数 cv::xfeatures2d::SURF_Impl::detectAndCompute

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

标签: opencvimage-processingsurf

解决方案


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正在返回一个浮动图像。

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

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

推荐阅读