我一直在使用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的站点上。
答案 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
和类似的设定者。