我已经梳理了网络,寻找一种方法来获取OpenCV 2.3.1a特征提取/描述符绑定,以吐出任何风格的图像特征/描述符(STAR / SURF / ORB / SIFT / FAST)。我很清楚OpenCV有一个叫做“goodFeaturesToTrack”的方法。由于没有功能描述符(这是我真正需要的),这对我没有帮助。我已按照此处列出的文档进行操作:
http://opencv.itseez.com/modules/features2d/doc/feature_detection_and_description.html
似乎没什么用。我已经尝试了所有描述符/功能的风格。我尝试使用单通道和多通道图像(即彩色和黑白)和多种图像格式(8位和32位)。我使用了当前的发行版并从源代码库中构建了绑定。大多数方法导致“unknown not a numpy array”错误。这是一个例子:
SimpleCV:1>import cv2
SimpleCV:2>img = Image("aerospace.jpg")
SimpleCV:3>bwimg = img._getGrayscaleBitmap()
SimpleCV:4>bwimg
SimpleCV:4><iplimage(nChannels=1 width=600 height=400 widthStep=600 )>
SimpleCV:5>surfer = cv2.SURF(0.5,4,2,False,False)
SimpleCV:6>points = surfer.detect(bwimg,None)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/Library/Python/2.6/site-packages/SimpleCV-1.2-py2.6.egg/SimpleCV/Shell/Shell.pyc in <module>()
-
TypeError: <unknown> is not a numpy array
SimpleCV:7>
值得注意的是,我使用SimpleCV加载图像,但方法_getGrayscaleBitmap()返回OpenCV使用的灰色8位IPL图像。我确信这是有效的,因为我使用它与其他数百种OpenCV方法无关。
所以任何人都可以向我指出网络上此代码的 WORKING 示例。我已经梳理了几十个例子,发现没有任何效果。
答案 0 :(得分:10)
Kat,这适合我:
s = cv2.SURF()
mask = uint8(ones(gray.shape))
keypoints = s.detect(gray,mask)
我可以绘制关键点和所有关键点。要获取描述符,您可以尝试这个
k,d = s.detect(gray,mask,False)
d = d.reshape((-1,128))
print d.shape, len(k)
d在关键点列表中应该具有相同的长度。
我在这里的OpenCV章节中有这个例子: http://www.maths.lth.se/matematiklth/personal/solem/book.html
答案 1 :(得分:0)
看起来你有一个PIL图像。尝试转换为numpy图像: npImage = np.array(img)