mac osx bigsur 上的 opencv 性能下降

ang*_*yip 5 python macos opencv

我正在使用 Python 2.7.1 通过 python 在 MAC OSX BigSur 11.0.1 ( i9 intel ) 上运行 opencv。在我的 mac 上运行的最后一个稳定实现是 opencv-python 4.1.2.30 。自从更新 BigSur 以来,我注意到以下 opencv 函数的性能显着降低:

cv2.waitKey(1)
Run Code Online (Sandbox Code Playgroud)

这是我播放视频的整个脚本。注意:视频是以 130FPS 拍摄的。

import cv2
import sys
import time

video = "myvideo.mp4"

view_name = "my_video"
cv2.namedWindow(view_name)
cv2.moveWindow(view_name,250,150)

cap = cv2.VideoCapture(video)
tots = cap.get(cv2.CAP_PROP_FRAME_COUNT)
i = 0
cv2.createTrackbar('S',view_name, 0,int(tots)-1, lambda x:x)
cv2.setTrackbarPos('S',view_name,0)

status = 'pause'
previous_status = 'pause'

while True:
  try:
    if i==tots-1:
      i=0
    cap.set(cv2.CAP_PROP_POS_FRAMES, i)
    #start = time.time()
    ret, im = cap.read()
    cv2.imshow(view_name, im)
    status = { ord(' '):'play_pause_click',
            ord('a'):'prev_frame', ord('A'):'prev_frame',
            ord('d'):'next_frame', ord('D'):'next_frame',
            -1: status, 
            27: 'exit'}[cv2.waitKey(1)]
     #checkpointTwo = time.time()
     #print(checkpointTwo - start)

    if (status == 'play_pause_click' and previous_status == 'play_pause_click'):
        status = 'pause'
        previous_status = 'pause'
    if (status == 'play_pause_click'):
        status = 'play'
        previous_status = 'play_pause_click'

    if status == 'play':
      i+=1
      cv2.setTrackbarPos('S',view_name,i)
      continue
    if status == 'pause':
      i = cv2.getTrackbarPos('S',view_name)
    if status == 'exit':
        break
    if status=='prev_frame':
        i-=1
        cv2.setTrackbarPos('S',view_name,i)
        status='pause'
    if status=='next_frame':
        i+=1
        cv2.setTrackbarPos('S',view_name,i)
        status='pause'

  except KeyError:
    print("Invalid Key was pressed")
cv2.destroyWindow(view_name)
Run Code Online (Sandbox Code Playgroud)

我单击机器上的空格键以开始自动逐帧播放视频。我记下经过的时间,我可以看到这些结果:

在此处输入图片说明

在第 90 个百分位数处,代码块的执行时间接近 150 毫秒。为了比较,如果我测量 cap.read() 和 cv2.imshow() 函数,我的执行时间 < 1 ms。这是一个 cdf 图:

在此处输入图片说明

虽然我在使用以前的 MAC OSX 版本时没有基准测试,但我可以直观地看出它的速度要慢得多。

我查看了 opencv-python文档页面,其中有以下引用:

用于 Python 的非官方预构建的仅限 CPU 的 OpenCV 包。

我开始怀疑这可能是问题所在,我应该为我的机器从头开始重新构建 opencv 包。但是,我不确定这是否会解决问题或如何从头开始执行此操作。我也完全有可能错误地使用了 opencv 函数。

我能做些什么来修复大的 150ms?