C++ Python和C++;OpenCV的编码?

C++ Python和C++;OpenCV的编码?,c++,python,performance,opencv,C++,Python,Performance,Opencv,我的目标是一点一点地启动opencv,但首先我需要确定opencv的哪个API更有用。我预测Python实现较短,但运行时间将比本地C++实现更密集和慢。有没有人知道这两个观点的性能和编码差异? < P>你是对的,Python几乎总是比C++慢得多,因为它需要一个解释程序,而C++却没有。但是,这要求C++具有强类型化,这就使得错误的余量更小。有些人喜欢严格地编写代码,而另一些人则喜欢Python固有的宽容 如果你想对Python编码风格和C++编码风格进行全面的讨论,这不是最好的地方,试着找到

我的目标是一点一点地启动opencv,但首先我需要确定opencv的哪个API更有用。我预测Python实现较短,但运行时间将比本地C++实现更密集和慢。有没有人知道这两个观点的性能和编码差异?

< P>你是对的,Python几乎总是比C++慢得多,因为它需要一个解释程序,而C++却没有。但是,这要求C++具有强类型化,这就使得错误的余量更小。有些人喜欢严格地编写代码,而另一些人则喜欢Python固有的宽容

如果你想对Python编码风格和C++编码风格进行全面的讨论,这不是最好的地方,试着找到一篇文章。 编辑:


因为Python是一种解释性语言,而C++被编译成机器代码,一般来说,可以使用C++获得性能优势。然而,关于使用OpenCV,核心OpenCV库已经编译成机器代码,因此OpenCV库周围的Python包装器正在执行编译代码。换言之,当从Python执行计算昂贵的OpenCV算法时,由于它们已经被编译为您正在使用的特定架构,所以不会看到性能上的很多冲击。正如前面的答案中提到的,Python比C++更慢,或者C. Python是为了简单而构建的。可移植性和创造性,用户只需担心他们的算法,而无需担心编程问题

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


因此,当您从Python调用OpenCV中的函数时,实际运行的是底层C/C++源代码。所以性能上不会有太大的差异。(我记得我在某个地方读到性能损失是openCV的所有google结果都是一样的:python只会稍微慢一点。但我一次也没有看到任何关于这方面的分析。所以我决定做一些,并发现:

<强> Python比OpenCV明显慢C++,即使对于平凡的程序也是如此。>/P> 我能想到的最简单的例子是在屏幕上显示网络摄像头的输出并显示每秒的帧数用C++,我得到了65 fPS,增加了25%。在这两种情况下,CPU使用的是一个单一的内核,据我所知,它受到CPU性能的限制。 此外,这个关于的测试用例与我在过去从一个移植到另一个的项目中看到的一致

在Python中,所有的OpenCV函数都返回图像矩阵的新副本。每当你捕获一个图像,或者如果你在C++中调整它,你就可以重新使用现有的内存。在Python中你不能。我猜想这个分配内存的时间是主要的区别,因为正如其他人所说的:底层C。OpenCV的ODE是C++。

在将Python扔出窗口之前:Python在开发中要快得多,如果你不运行硬件约束,或者开发速度比性能更重要,那么使用Python。在很多应用中,我已经用OpenCV完成了,我从Python开始,后来只将计算机视觉组件转换成C++。(例如使用python的ctype模块并将CV代码编译到共享库中)

Python代码:

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
C++代码:

#include <opencv2/opencv.hpp>
#include <stdint.h>

using namespace std;
using namespace cv;

#define FPS_SMOOTHING 0.9

int main(int argc, char** argv){
    VideoCapture cap(2);
    Mat frame;

    float fps = 0.0;
    double prev = clock(); 
    while (true){
        double now = (clock()/(double)CLOCKS_PER_SEC);
        fps = (fps*FPS_SMOOTHING + (1/(now - prev))*(1.0 - FPS_SMOOTHING));
        prev = now;

        printf("fps: %.1f\n", fps);

        if (cap.isOpened()){
            cap.read(frame);
        }
        imshow("asdf", frame);
        if (waitKey(2) == 27){
            break;
        }
    }
}
#包括
#包括
使用名称空间std;
使用名称空间cv;
#定义FPS_平滑0.9
int main(int argc,字符**argv){
视频捕捉帽(2);
垫架;
浮球fps=0.0;
双上一个=时钟();
while(true){
现在加倍=(时钟()/(加倍)每秒时钟);
fps=(fps*fps_平滑+(1/(现在-上一个))*(1.0-fps_平滑));
上一个=现在;
printf(“fps:%.1f\n”,fps);
if(cap.isOpened()){
阅读(框架);
}
imshow(“asdf”,框架);
如果(等待键(2)=27){
打破
}
}
}
可能的基准限制:

  • 摄像机帧速率
  • 定时器测量精度
  • 打印格式化所花费的时间
缺少一个事实,即您可以在Python中重用数组。预先分配数组并将其传入,它们就会被使用。因此:

    image = numpy.zeros(shape=(height, width, 3), dtype=numpy.uint8)
    #....
    retval, _ = cv.VideoCapture.read(image)
为什么选择? 如果您同时了解
Python
C++
,请使用
Python
进行研究,使用
Jupyter笔记本
,然后使用
C++
进行实现。
Jupyter
OpenCV(cv2)
Numpy
Python
堆栈提供了快速原型。
将代码移植到
C++
通常非常简单。

大多数实际工作都是由OpenCV
C
代码在幕后完成的,所以只要您自己的代码不太复杂,差异就不应该像您天真地期望的那么大。您的测试用例恰好是显示最大差异的测试用例一个更好的测试将看视频帧,也许试着把目标瞄准一个自驾车的RAOD。这将是C++ C++或Python的几乎相同的运行时间。无压情况显示加载帧缓冲需要多长时间,而不是任何实际工作。g占主导地位。如果做实际工作,那么帧缓冲只占总数的2%,而不是100%。虽然我目前没有任何基准测试,但我怀疑它比您预测的更重要。例如,如果您在python
dst=cv2.filter2D(img,-1,内核)