使用Python在OpenCv中设置ORB参数

时间:2012-12-01 09:38:31

标签: python opencv

我一直在使用Python中的OpenCV 2.4匹配两个图像之间的功能,但我想更改“ORB”检测器的一个参数(它提取的功能数量“nfeatures”)并且似乎有没办法在Python中这样做。

对于C ++,您可以通过FeatureDetector / DescriptorExtractor的'read'(或java的'load')方法加载参数yml / xml文件。但是Python绑定缺少此函数/方法。

它也缺少直接创建ORB对象的绑定,所以我无法在那里传递参数(Python绑定似乎要求你使用字符串名称来使用cv2.DescriptorExtractor_create - 如果你传递一个错误的字符串将会出现段错误名称或参数以及它...此外,该函数不能采用它似乎传递给构造函数的任何其他参数。

我唯一的希望似乎是使用cv2.cv.Load(filename)从xml加载完整的对象,但这似乎是期望一个对象实例而不是算法定义,我找不到任何Python绑定新旧语法。我在文件加载步骤中尝试了几种变体,包括模仿OpenCV中保存的xml文件的样式而没有运气。

有没有人在上面尝试过的其中一个步骤中将参数传递到OpenCV中的检测器(SURF或ORB或任何通用算法)?

以下是我用于提取功能的代码:

def findFeatures(greyimg, detector="ORB", descriptor="ORB"):
    nfeatures = 2000 # No way to pass to detector...?
    detector = cv2.FeatureDetector_create(detector)
    descriptorExtractor = cv2.DescriptorExtractor_create(descriptor)
    keypoints = detector.detect(greyimg)
    (keypoints, descriptors) = descriptorExtractor.compute(greyimg, keypoints)
    return keypoints, descriptors

修改

更改检测器设置似乎只是对Windows实现的段错误 - 等待修补程序或修复程序出现在OpenCV的站点上。

1 个答案:

答案 0 :(得分:4)

import cv2

# to see all ORB parameters and their values
detector = cv2.FeatureDetector_create("ORB")    
print "ORB parameters (dict):", detector.getParams()
for param in detector.getParams():
    ptype = detector.paramType(param)
    if ptype == 0:
        print param, "=", detector.getInt(param)
    elif ptype == 2:
        print param, "=", detector.getDouble(param)

# to set the nFeatures
print "nFeatures before:", detector.getInt("nFeatures")
detector.setInt("nFeatures", 1000)
print "nFeatures after:", detector.getInt("nFeatures")

带输出:

ORB参数(字典):['WTA_K','edgeThreshold','firstLevel','nFeatures','nLevels','patchSize','scaleFactor','scoreType'] WTA_K = 2
edgeThreshold = 31
firstLevel = 0
nFeatures = 500
nLevels = 8
patchSize = 31
scaleFactor = 1.20000004768
scoreType = 0
nFeatures之前:500
nFeatures:1000

编辑:使用OpenCV 3.0做同样的事情现在更容易

import cv2

detector = cv2.ORB_create()
for attribute in dir(new_detector):
    if not attribute.startswith("get"):
        continue
    param = attribute.replace("get", "")
    get_param = getattr(new_backend, attribute)
    val = get_param()
    print param, '=', val

和类似的设定者。