所有这些 OpenCV Python 接口之间有啥不同?
Posted
技术标签:
【中文标题】所有这些 OpenCV Python 接口之间有啥不同?【英文标题】:What is different between all these OpenCV Python interfaces?所有这些 OpenCV Python 接口之间有什么不同? 【发布时间】:2012-05-12 03:00:59 【问题描述】:有
opencv
(来自 OpenCV 的库),
cv
(来自 OpenCV 家伙的旧库)和
pyopencv
及其前身 ctypes-opencv
。
主要区别是什么?我应该使用哪一个?
【问题讨论】:
【参考方案1】:OpenCV 官方发布了两种 Python 接口,cv
和 cv2
。
简历:
我开始研究cv
。在此,所有 OpenCV 数据类型都被保留。例如,加载时,图像的格式为 cvMat
,与 C++ 中的格式相同。
对于数组操作,有cvSet2D
、cvGet2D
等几个函数。有些讨论说,它们比较慢。
对于 imageROI,您需要像 cvSetImageROI
这样的特殊函数。
如果找到轮廓,则返回 cvSeq
结构,与 Python 列表或 NumPy 数组相比,它不太好处理。
(而且我想,它的开发很快就会停止。之前,只有cv
。后来,OpenCV 附带了cv
和cv2
。现在,在最新版本中,只有cv2
模块,而cv
是cv2
内部的子类。您需要调用import cv2.cv as cv
才能访问它。)
cv2:
最新的是cv2
。在此,所有内容都返回为NumPy
对象,如ndarray
和native Python
对象,如lists
、tuples
、dictionary
等。因此,由于此 NumPy 支持,您可以在此处执行任何 numpy 操作。 NumPy
是一个高度稳定、快速的数组处理库。
例如,如果您加载图像,则返回 ndarray
。
array[i,j]
为您提供 (i,j) 位置的像素值。
另外,对于 imageROI,可以像ROI=array[c1:c2,r1:r2]
一样使用数组切片。不需要单独的函数。
要添加两个图像,不需要调用任何函数,只需执行res = img1+img2
。 (但 NumPy 加法是对图像等 uint8 数组进行模运算。请参阅文章 Difference between Matrix Arithmetic in OpenCV and Numpy 了解更多信息。
返回的轮廓是 Numpy 数组的列表。您可以在 Contours - 1 : Getting Started 中找到有关轮廓的详细讨论。
简而言之,有了 cv2,一切都得到了简化,而且速度非常快。
关于 NumPy 如何加速 cv2
的简单讨论在 Stack Overflow 问题中Performance comparison of OpenCV-Python interfaces, cv and cv2。
pyopencv:
我对这个了解不多,因为我没有使用它。但它似乎已经停止了进一步的开发。
我觉得还是坚持官方图书馆比较好。
简而言之,我会推荐你使用 cv2!
编辑:您可以在 Install OpenCV in Windows for Python 中查看cv2
模块的安装过程。
【讨论】:
cv2 如果您从源代码构建 OpenCV,将编译和安装 Python 接口。如果您使用 Linux 或其他操作系统的二进制包,您应该查阅您的操作系统/分发文档。请参阅goo.gl/MUjXi 寻求帮助。 @Framester:请参阅此链接中 cv2 的安装过程:opencvpython.blogspot.in/2012/05/… Abid 的回答很棒。再补充一点:我做了a project with Python 3.x,我可以访问opencv的唯一方法是通过ctypes_opencv和原始的OpenCV 1.0。它声称支持 OpenCV pre1.1,但我从来没有让它工作。这样,您将使用原始的 cvSetROI 等 C 类型接口。 如果你想用 pip 安装它。阅读here 或做:pip install opencv-python
以上是关于所有这些 OpenCV Python 接口之间有啥不同?的主要内容,如果未能解决你的问题,请参考以下文章
Keras 和 TensorFlow 中所有这些交叉熵损失之间有啥区别?