在OpenCV中始终使用最新相机帧的正确方法是什么

问题描述 投票:0回答:1

我正在尝试从网络摄像头拍摄静态照片并对图像进行一些处理

我正在使用

Python 3.10.9
opencv-python==4.9.0.80

这几乎就是我设置 USB 网络摄像头的方式

camera = cv2.VideoCapture(0) 
camera.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)

这就是我拍照的方式

camera_status, photo = camera.read()

我注意到,虽然拍摄的照片通常不是最新的,但在线浏览时我发现作为解决方法,您必须通过尝试读取帧来清除相机缓冲区。因此,作为一种解决方法,我尝试先读取 4 帧以清除缓冲区,然后仅处理第 5 个帧。这有效,只是显着减慢了照片拍摄速度

# 1. Clear camera buffer
try:
    for _ in range(4):
        camera.read()
except Exception as e:
    raise RuntimeError(f'Encountered error trying to clear camera buffer: {e}')

我的网络摄像头约为 24FPS,我尝试设置一个每秒连续读取 16 帧的线程。这同样有助于确保每个静止图像都是最新的帧,但捕获持续时间现在有更多的变化

意味着有些照片需要 0.009 秒,而另一些则需要 0.5 秒。

是否有更干净的或某种标准且可接受的方法来确保从相机流中获取的静态图像始终是 OpenCV 中最新的?

谢谢

python opencv video camera
1个回答
0
投票
  • 使用grab()和retrieve():

OpenCV提供了两种方法:grab()和retrieve()。这些方法允许您分离抓取帧(将其加载到内存中)和检索帧(对其进行解码)的过程。

  • 使用单独的线程:

另一种常见方法是创建一个单独的线程,以全 FPS 持续从相机捕获帧。 在主线程(事件发生的地方)中,您可以从线程中检索最新的帧。

© www.soinside.com 2019 - 2024. All rights reserved.