Python ExtractSURF始终返回相同的方向

Python ExtractSURF始终返回相同的方向,python,opencv,computer-vision,Python,Opencv,Computer Vision,我只是想开始学习OpenCV。我的理解是,ExtractSURF应该返回0到360之间的角度。出于某种原因,关键点总是为我返回90的方向。你知道为什么吗 此代码: import cv image = cv.LoadImageM('lena.bmp', cv.CV_LOAD_IMAGE_GRAYSCALE) (keypoints, descriptors) = cv.ExtractSURF(image, None, cv.CreateMemStorage(), (0, 6000, 1, 3)) f

我只是想开始学习OpenCV。我的理解是,ExtractSURF应该返回0到360之间的角度。出于某种原因,关键点总是为我返回90的方向。你知道为什么吗

此代码:

import cv
image = cv.LoadImageM('lena.bmp', cv.CV_LOAD_IMAGE_GRAYSCALE)
(keypoints, descriptors) = cv.ExtractSURF(image, None, cv.CreateMemStorage(), (0, 6000, 1, 3))
for keypoint in keypoints:
    ((x, y), laplacian, size, dir, hessian) = keypoint
    print "x=%d y=%d laplacian=%d size=%f dir=%f hessian=%f" % (x, y, laplacian, size, dir, hessian)
返回

x=345 y=201 laplacian=1 size=22.000000 dir=90.000000 hessian=6674.604492
x=82 y=270 laplacian=-1 size=18.000000 dir=90.000000 hessian=7615.113770
x=90 y=278 laplacian=-1 size=15.000000 dir=90.000000 hessian=12525.487305
x=112 y=254 laplacian=1 size=22.000000 dir=90.000000 hessian=8894.154297
x=273 y=274 laplacian=-1 size=24.000000 dir=90.000000 hessian=16313.005859
x=154 y=319 laplacian=-1 size=15.000000 dir=90.000000 hessian=9818.360352
x=172 y=333 laplacian=-1 size=26.000000 dir=90.000000 hessian=8314.745117
x=137 y=386 laplacian=-1 size=15.000000 dir=90.000000 hessian=9148.833984
x=140 y=363 laplacian=-1 size=22.000000 dir=90.000000 hessian=7735.985840

您缺少
\u直立
参数,该参数告诉OpenCV是否计算角度。所以我假设OpenCV决定只返回90度,如果您没有指定它。我不记得是否有办法在旧的
cv
界面中指定它。但是,在较新的
cv2
界面中,它非常简单:

import cv2
指定所需的冲浪参数:

surf_params = {"_hessianThreshold":1000,
 "_nOctaves":4, 
"_nOctaveLayers":2, 
"_extended":1, 
"_upright":0}
请注意,以
1
的方式垂直传递
将始终返回
90
的角度

构造冲浪对象并读取图像:

surf = cv2.SURF(**surf_params)
image = cv2.imread('img.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE)
(keypoints, descriptors) = surf.detect(image, mask=None, useProvidedKeypoints=False)

for keypoint in keypoints:
    x,y = keypoint.pt
    size = keypoint.size 
    orientation = keypoint.angle
    response = keypoint.response 
    octave = keypoint.octave
    class_id = keypoint.class_id
    print (x,y), size, orientation
这将返回(x,y)、大小和方向的示例:(我使用的是不同的图像)

就这样。这就是为什么我总是建议人们切换到较新的
cv2
界面的原因之一。自从我做了这个转换,我再也不用处理像丢失参数这样的事情了


我希望这对你有帮助

效果很好。谢谢你的帮助!看起来web上的大多数示例都使用cv而不是cv2。关于我应该在哪里学习cv2,有什么建议吗?一般来说,我发现两者非常相似,只是
cv2
对于Python用户来说更直观。你可能会提到或,但大多数时候我只是用谷歌来找到我需要的东西。不幸的是,OpenCV没有像我们希望的那样完整地记录在案!谢谢你的提示。我没有意识到python绑定在参考手册中。这应该会有很大帮助。
(523.3077392578125, 933.419189453125) 156.0 199.023590088
(1417.82470703125, 957.7914428710938) 166.0 127.772354126
(1398.8065185546875, 971.0693359375) 165.0 126.83026123
(1009.0242309570312, 1032.0604248046875) 176.0 164.367050171