OpenCV Python性能

2024-04-30 01:30:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个Python和OpenCV的新手。我正在处理OpenCV优化,我找到了Measuring Performance with OpenCV网站。我看到了cv2.getTickCount和{},并尝试使用一个空白的视频捕获代码:

import cv2

cap = cv2.VideoCapture(0)
time1 = 0

while True:
    e1 = cv2.getTickCount()
    ret, frame = cap.read()
    cv2.imshow("cam", frame)
    e2 = cv2.getTickCount()
    time1 = (e2 - e1) / cv2.getTickFrequency() + time1
    print time1

    k = cv2.waitKey(1) & 0xFF

    if k == ord('q'):
        break

同时,我尝试time.time()来衡量性能:

^{pr2}$

elapsedTime和{}之间有很大的区别,比如:

[23.544186313842033, 29.413000106811523]
[23.588920849343307, 29.460999965667725]
[23.636793986833897, 29.51200008392334]
[23.669538024648435, 29.558000087738037]
[23.701628712445952, 29.605000019073486]
[23.737225731551163, 29.65499997138977]
[23.775527056696312, 29.703999996185303]
[23.82555789141547, 29.765000104904175]
[23.864218735017026, 29.813999891281128]
[23.901782255564854, 29.861000061035156]

我检查了两个输出,我手机的计时器在time.time()的一侧。在

我的问题是:

  1. 为什么我有这种不同?如何和为什么cv2.getTickCountcv2.getTickFrequency与{}不同
  2. 要进行绩效评估,我应该使用哪一个?在

Tags: time网站performancewithcv2frameopencvcap
2条回答

我不是很精通cv2,但我确实看到你的计时技巧有点不太靠谱。在

查看您使用cv2.getTickCount()测量的代码部分:

e1 = cv2.getTickCount()  # start
ret, frame = cap.read()
cv2.imshow("cam",frame)
e2 = cv2.getTickCount()  # stop

现在,看看您使用time.time()测量的内容:

^{pr2}$

你显然是在虐待可怜的ol'time在这里计算不同的东西。不幸的是,我无法验证实际的运行时,因为我没有OpenCV,但是,您可能希望将您的time调用与getTickCount()并驾齐驱。简而言之,使用类似的方法:

time1=0

while True:
    t_start = time.time()  # start
    ret, frame = cap.read()
    cv2.imshow("cam",frame)
    elapsedTime= time.time()-t_start  # stop    

重新评估你的结果,很可能getTickCount()会比time得到更准确的结果,因为它的实现方式,我真的不知道。在


至于你应该用哪一种呢?cv2的内部定时模块。在

为什么?因为,在不做奇怪的声明的情况下,它是一个经过测试的模块,它可能是由比我们更精通Python的人开发的。你自己掌握时间可能是一件棘手的事情,给小错误留下了很大的空间,尤其是当你刚开始的时候。在

所以,简而言之,使用getTickCount(),它是有原因的。在

这将产生一致的结果:

t_start = time.time()
e1 = cv2.getTickCount()

while True:
    ret, frame = cap.read()
    cv2.imshow("cam",frame)
    e2 = cv2.getTickCount()
    current_time = time.time() 
    time1 = (e2 - e1)/ cv2.getTickFrequency()
    elapsedTime= current_time - t_start
    print [time1 , elapsedTime]

实际上,我无法重现你的问题:

^{pr2}$

品脱值相当一致:

new: [0.101121973, 0.10170483589172363]
new: [0.202431593, 0.20299196243286133]
new: [0.303379863, 0.3039419651031494]
new: [0.404390379, 0.40494799613952637]
new: [0.505434471, 0.5059988498687744]
new: [0.606657266, 0.6072208881378174]
new: [0.70785313, 0.7083899974822998]
new: [0.808160676, 0.808696985244751]
new: [0.90930442, 0.9098358154296875]
new: [1.010264773, 1.0107979774475098]
old: [0.101093147, 0.10112500190734863]
old: [0.201946665, 0.20209193229675293]
old: [0.302889158, 0.3032569885253906]
old: [0.40368225999999996, 0.40418291091918945]
old: [0.504733644, 0.5053050518035889]
old: [0.605701044, 0.6063768863677979]
old: [0.7066711290000001, 0.707442045211792]
old: [0.807242644, 0.8081610202789307]
old: [0.908066402, 0.9092309474945068]
old: [1.008913762, 1.0102128982543945]

你确定打印出来的数字与你在问题中显示的代码相符吗?在

相关问题 更多 >