我该选择哪个版本的Python OpenCV?

7 投票
3 回答
5796 浏览
提问于 2025-04-15 19:03

我成功安装了opencv 2.0并且可以用python来使用它,但现在遇到了一些问题。在继续之前,我在想是否应该换个方案。正如ezod在这篇帖子中提到的:

“需要注意的是,从2.0版本开始,新的Python接口还不完整:很多我认为相当重要的功能都缺失了。同时,SWIG接口使用起来非常痛苦。而ctypes-opencv接口(一个第三方项目)在0.8.0版本时,不支持OpenCV 2.0。”

那么,我是继续使用2.0版本,还是换成ctypes呢?这样做我会错过什么呢?

我在使用OSX,python 2.5,想要做2D移动物体的跟踪,但我既不是python专家,也不是机器视觉专家!

3 个回答

0

我建议你使用OpenCV 2.1的官方Python接口,根据我所了解,它的功能和C++库是一样的。大部分功能都有Python版本的封装,或者是直接从C++版本翻译过来的。

Python的OpenCV文档没有C++的那么全面,但如果你觉得用Python来快速开发原型更方便,那你可以通过C++文档来理解Python的用法。

要注意的是,你找到的很多示例代码都是旧版本的,可能不兼容(比如现在所有内容都在cv这个包下面),但更新这些代码并不难。

3

这是一个迟到的回答。如果你不需要依赖早期版本,并且想用Python来使用OpenCV,建议选择最新的稳定版本。目前是OpenCV 2.3.1。

对于OpenCV ≥ 2.3的Python用户来说,最大的好处是新增了一个cv2模块,除了旧的(向后兼容的)cv模块。新的cv2模块更加符合Python的风格,不需要手动分配内存来处理中间数据结构。而旧的cv模块更像是C++ API的直接翻译。

举个例子,看看新的Python cv2.findContours(OpenCV ≥ 2.3):

findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy

它只需要三个参数,能够自动处理所有的内存分配,只返回最终的结果。用户只需要写一行代码。

而旧的cv.FindContours:

FindContours(image, storage [, mode [, method [, offset]]]) -> None

它要求用户在调用之前明确分配“存储空间”(还需要多写1到2行代码)。它不会直接返回结果,而是把结果保存在分配的存储中(这就像一个链表,用户还得写一些循环来提取存储中的数据)。总体来说,它更底层,更像C++而不是Python。在常见的使用情况下,至少需要4到5行代码,而新的cv2模块只需要一行。

1

我在使用自己编译的OpenCV 2.0和它自带的Python接口。到目前为止,我发现缺少了2到3个函数(比如FindFundamentalMat)。如果你获取OpenCV的源代码,你会发现一个文本文件interfaces/python/api,这个文件定义了每个可以在Python中使用的OpenCV函数的参数和返回类型。在重新编译时,系统会自动读取这个文件并生成Python扩展。根据我遇到的情况,我发现只要在api文件中为我需要的函数添加合适的定义,然后重新编译OpenCV,就能顺利解决问题。

撰写回答