OpenCV Python性能

3

我是一个 Python 和 OpenCV 的新手。我正在处理 OpenCV 优化,并找到了使用 OpenCV 测量性能的网站。我看到了 cv2.getTickCountcv2.getTickFrequency,并在一个空的视频捕获代码上进行了尝试:

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()来测量性能:

import cv2
import time

cap = cv2.VideoCapture(0)

t_start = time.time()
time1 = 0

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

    k = cv2.waitKey(1) & 0xFF

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

elapsedTimetime1之间存在巨大的区别,例如:

[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.getTickFrequencytime.time()有何不同之处?
  2. 要进行性能测量,应该使用哪一个?
2个回答

3

我并不是很精通cv2,但我在这里看到你的计时技术有些问题。

请看一下你用cv2.getTickCount()来测量代码的哪个部分:

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

现在,看看你正在使用 time.time() 来测量什么:

t_start=time.time()  # start
time1=0

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

你显然在错误地对待这里可怜的 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(),它是有原因存在的。

我按照你的建议更改了代码,得到了更好的结果:它们几乎相同。[41.4705076101 41.2309985161]我还更改了代码,并为 time.time()time1 使用了 1000 个样本。如果我在每次循环中打印结果,则这两段代码之间的差异会变大。与此同时,如果我在最后打印最终结果,则结果更有意义。 - aubatmaz

0

这应该产生一致的结果:

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]

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

import time
import cv2

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

for x in range(10):
    time.sleep(0.1)
    e2 = cv2.getTickCount()
    time1 = (e2 - e1)/ cv2.getTickFrequency()
    elapsedTime= time.time() - t_start
    print 'new:', [time1 , elapsedTime]

t_start=time.time()
time1=0

for x in range(10):

    e1 = cv2.getTickCount()
    time.sleep(0.1)
    e2 = cv2.getTickCount()
    time1 = (e2 - e1)/ cv2.getTickFrequency() + time1
    elapsedTime= time.time()-t_start
    print 'old:', [time1 , elapsedTime]

点是相当一致的值:

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]

你确定打印出来的数字对应你在问题中展示的代码吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接