成功安装了带有python绑定的opencv 2.0后,我开始遇到麻烦,在我再进一步之前,我想知道是否应该改为另一种选择。正如ezod对此post所说:
“作为一个警告,从2.0版本开始,新的Python绑定是不完整的:我认为很多功能都很重要。同时,SWIG绑定也是令人痛苦的工作.ctypes-opencv绑定(第三方项目),从版本0.8.0开始,不支持OpenCV 2.0。“
那么,我应该继续使用2.0还是应该选择ctypes?在任何一种方式上我都错过了什么?
我正在使用OSX,python 2.5并希望在移动对象的2d中进行跟踪,既不是python也不是机器视觉专家!
答案 0 :(得分:3)
迟到的答案。如果您不必依赖早期版本,并希望将OpenCV与Python一起使用,请选择最新的稳定版本。今天是OpenCV 2.3.1。
OpenCV≥2.3对于Python 用户的主要好处:除了旧的(向后兼容的)cv2
模块之外,还有一个新的cv
模块。新的cv2
模块更加pythonic,不需要手动内存分配中间数据结构。旧的cv
模块更像是C ++ API的直接翻译。
例如,比较新的Python cv2.findContours
(OpenCV≥2.3):
findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy
它只需要三个参数,并且可以自动处理所有内存分配,只返回最终结果。只需一行用户代码。
Vs以上。旧cv.FindContours
:
FindContours(image, storage [, mode [, method [, offset]]]) -> None
它要求用户在呼叫之前显式分配“存储”(+ 1或2行代码)。它不会返回结果,而是将其保存在已分配的存储中(它的工作方式类似于链表,并且用户必须编写一些循环才能实际从存储中提取数据)。总体而言,更低级,更像是C ++而不是Python。常见用例中至少有4-5行代码,而不是只有一行新cv2
模块。
答案 1 :(得分:1)
我正在使用自编译的OpenCV 2.0,它内置了python绑定。到目前为止,我缺少2或3个函数(例如 FindFundamentalMat )。如果您获得了OpenCV的源代码,则会找到一个文本文件 interfaces / python / api ,它定义了Python提供的每个OpenCV函数的参数和返回类型。重新编译后,自动生成器将解析此文件并构建python扩展。对于我经历过的所有情况,我发现在 api 中为我需要的函数添加一个合适的定义,然后重新编译opencv,效果很好。
答案 2 :(得分:0)
我建议您使用the official Python bindings to OpenCV 2.1,据我所见,它具有与C ++库相同的功能。他们中的大多数都有pythonic包装器,或C ++版本的直接翻译。
Python的OpenCV文档并不像C ++那样完整,但如果你觉得原型的语言优势是值得的,那么你将能够从C++ documentation了解Python的用法。
请注意,您将找到的许多现有示例代码来自以前的版本并且不兼容(例如,现在所有代码都位于cv
包下),但是要弄清楚如何更新它并不难。