C++ Python和C++;OpenCV的编码?
我的目标是一点一点地启动opencv,但首先我需要确定opencv的哪个API更有用。我预测Python实现较短,但运行时间将比本地C++实现更密集和慢。有没有人知道这两个观点的性能和编码差异? < P>你是对的,Python几乎总是比C++慢得多,因为它需要一个解释程序,而C++却没有。但是,这要求C++具有强类型化,这就使得错误的余量更小。有些人喜欢严格地编写代码,而另一些人则喜欢Python固有的宽容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++编码风格进行全面的讨论,这不是最好的地方,试着找到
如果你想对Python编码风格和C++编码风格进行全面的讨论,这不是最好的地方,试着找到一篇文章。 编辑:
因为Python是一种解释性语言,而C++被编译成机器代码,
因此,当您从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){
打破
}
}
}
可能的基准限制:
- 摄像机帧速率
- 定时器测量精度
- 打印格式化所花费的时间
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++
通常非常简单。大多数实际工作都是由OpenCVC
代码在幕后完成的,所以只要您自己的代码不太复杂,差异就不应该像您天真地期望的那么大。您的测试用例恰好是显示最大差异的测试用例一个更好的测试将看视频帧,也许试着把目标瞄准一个自驾车的RAOD。这将是C++ C++或Python的几乎相同的运行时间。无压情况显示加载帧缓冲需要多长时间,而不是任何实际工作。g占主导地位。如果做实际工作,那么帧缓冲只占总数的2%,而不是100%。虽然我目前没有任何基准测试,但我怀疑它比您预测的更重要。例如,如果您在pythondst=cv2.filter2D(img,-1,内核)