我一直在使用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或任何通用算法)?
以下是我用于提取特征的代码:
对于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网站上的补丁或修复。
detector.getParams()
导致了Segmentation Fault,没有堆栈跟踪,没有异常可捕获,也没有来自OpenCV的错误消息。你使用的设置是什么,让它不会立即Segfault? - Pyrce