OpenCV的Python或C ++编码的性能是否不同?

时间:2012-11-17 17:14:44

标签: c++ python performance opencv

我的目标是一点一点地启动opencv,但首先我需要确定哪个OpenCV API更有用。我预测Python实现会更短,但与本机C ++实现相比,运行时间会更加密集和缓慢。有没有人知道可以评论这两种观点之间的表现和编码差异?

5 个答案:

答案 0 :(得分:128)

正如前面的答案中所提到的,与C ++或C相比,Python速度较慢.Python是为了简化,便携性和创造性而构建的,用户只需要担心算法,而不是编程麻烦。

但是在OpenCV中,有一些不同的东西。 Python-OpenCV只是原始C / C ++代码的包装器。它通常用于结合两种语言的最佳功能, C / C ++& amp;简单的Python

因此,当您从Python调用OpenCV中的函数时,实际运行的是底层C / C ++源代码。所以性能没有太大差异。(我记得我读到的地方性能损失<1%,不记得在哪里。对OpenCV中一些基本功能的粗略估计显示最坏情况< / strong>惩罚<4%。即penalty = [maximum time taken in Python - minimum time taken in C++]/minimum time taken in C++)。

当你的代码有很多原生的python代码时会出现问题。例如,如果你正在制作自己的OpenCV中没有的功能,事情会变得更糟。这些代码在Python中本地运行,这大大降低了性能。

但新的OpenCV-Python界面完全支持Numpy。 Numpy是Python中的科学计算软件包。它也是本机C代码的包装器。它是一个高度优化的库,支持各种矩阵操作,非常适合图像处理。因此,如果您可以正确组合OpenCV函数和Numpy函数,您将获得非常高速的代码。

要记住的是,总是尽量避免Python中的循环和迭代。相反,使用Numpy(和OpenCV)中提供的数组操作工具。简单地使用C = A+B添加两个numpy数组比使用双循环快很多倍。

例如,您可以查看这些文章:

  1. Fast Array Manipulation in Python
  2. Performance comparison of OpenCV-Python interfaces, cv and cv2

答案 1 :(得分:8)

所有google的openCV结果都相同:python只会稍微慢一点。但我从未见过对此的任何分析。所以我决定做些发现:

即使使用普通程序,Python也比使用opencv的C ++慢得多。

我能想到的最简单的示例是在屏幕上显示网络摄像头的输出并显示每秒的帧数。使用python,我达到了50FPS(在Intel原子上)。使用C ++,我得到了65FPS,增长了25%。在这两种情况下,CPU的使用都使用单个内核,据我所知,它受CPU性能的约束。 另外,该测试案例与我过去从一个移植到另一个的项目中看到的情况一致。

差异来自何处?在python中,所有openCV函数都返回图像矩阵的新副本。每当您捕获图像或调整图像大小时-在C ++中,您都可以重新使用现有的内存。在python中,您不能。我怀疑这次分配内存的时间是主要区别,因为正如其他人所说:openCV的基础代码是C ++。

在将python抛诸脑后之前:python的开发速度要快得多,如果您没有遇到硬件限制,或者如果开发速度比性能更重要,那么请使用python。在使用openCV完成的许多应用程序中,我从python开始,后来仅将计算机视觉组件转换为C ++(例如,使用python的ctype模块并将CV代码编译到共享库中)。

Python代码:

"./dist/index.d.ts"

C ++代码:

import cv2
import time

FPS_SMOOTHING = 0.9

cap = cv2.VideoCapture(2)
fps = 0.0
prev = time.time()
while True:
    now = time.time()
    fps = (fps*FPS_SMOOTHING + (1/(now - prev))*(1.0 - FPS_SMOOTHING))
    prev = now

    print("fps: {:.1f}".format(fps))

    got, frame = cap.read()
    if got:
        cv2.imshow("asdf", frame)
    if (cv2.waitKey(2) == 27):
        break

可能的基准限制:

  • 相机帧速率
  • 计时器测量精度
  • 花在打印格式上的时间

答案 2 :(得分:3)

你是对的,Python几乎总是比C ++慢很多,因为它需要一个解释器,而C ++却没有。但是,这确实要求C ++是强类型的,这会留下更小的错误余量。有些人更喜欢严格编码,而其他人喜欢Python的内在宽容。

如果您想要对Python编码样式与C ++编码样式进行完整讨论,那么这不是最佳选择,请尝试查找文章。

编辑: 因为Python是一种解释型语言,而C ++编译为机器代码, 一般来说 ,您可以使用C ++获得性能优势。但是,关于使用OpenCV,核心OpenCV库已经编译成机器代码,因此围绕OpenCV库的Python包装器正在执行编译代码。换句话说,当谈到从Python执行计算上昂贵的OpenCV算法时,你不会看到很多性能损失,因为它们已经针对你正在使用的特定架构进行了编译。

答案 3 :(得分:3)

answer from sdfgeoff缺少您可以在Python中重用数组的事实。预分配它们并传递它们,它们将被使用。所以:

    image = numpy.zeros(shape=(height, width, 3), dtype=numpy.uint8)
    #....
    retval, _ = cv.VideoCapture.read(image)

答案 4 :(得分:0)

为什么选择? 如果您知道 PythonC++,请使用 Python 使用 Jupyter Notebooks 进行研究,然后使用 C++ 进行实现。 PythonJupyterOpenCV (cv2)Numpy 堆栈提供快速原型设计。 将代码移植到 C++ 通常非常简单。