OpenCV Python绑定中的特征检测
我在网上找了很久,想要找到一种方法,让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 is 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方法都没有问题。
所以,有没有人能给我指个方向,找一个在网上能用的有效代码示例?我已经看了很多例子,但没有找到任何能用的。
2 个回答
0
看起来你有一个PIL格式的图片。试着把它转换成numpy格式的图片吧:
npImage = np.array(img)
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