欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > OpenCV Python 版使用教程(三)摄像头读取延迟解决方法

OpenCV Python 版使用教程(三)摄像头读取延迟解决方法

2024/11/2 11:12:47 来源:https://blog.csdn.net/wangtcCSDN/article/details/143418093  浏览:    关键词:OpenCV Python 版使用教程(三)摄像头读取延迟解决方法

文章目录

  • 一、上篇回顾
  • 二、产生原因
  • 三、解决方法
    • 1. cap.grab() 方法
    • 2. 多线程法
  • 总结


一、上篇回顾

在上一篇中,简单介绍了如何使用 OpenCV 操作摄像头,本期来讲在摄像头读取时,可能会出现画面延迟的解决方法。

二、产生原因

OpenCV 在读取的时候,会将视频流放在缓冲区中,然后每次调用的时候,会从缓冲区内读取视频帧。虽然说大多数情况难以出现写入缓冲区远大于读取缓冲区的速度,但是当设备出现性能瓶颈,尤其是在 树莓派 等嵌入式设备中,容易出现CPU 瓶颈,从而引发问题。

三、解决方法

1. cap.grab() 方法

virtual bool cv::VideoCapture::grab()

官网对于这个函数的描述如下:

The primary use of the function is in multi-camera environments, especially when the cameras do not have hardware synchronization. 
That is, you call VideoCapture::grab() for each camera and after that call the slower method VideoCapture::retrieve()
to decode and get frame from each camera. This way the overhead on demosaicing or motion jpeg
decompression etc. is eliminated and the retrieved frames from different cameras will be closer in time. 

从官网的描述来看,这个函数主要用在多个摄像机中,用于摄像头硬件同步,这个函数和 cap.retrieve() 配合使用。当然也可以使用 cap.read() 再次读取。

同时也可以进一步设置缓冲区的大小,代码如下:

cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)

在这里设置 Capture 的缓冲区大小为 1 帧。

2. 多线程法

import cv2
import threadingclass VideoCaptureThread:def __init__(self, index=0):self.cap = cv2.VideoCapture(index)self.frame = Noneself.running = Trueself.lock = threading.Lock()self.thread = threading.Thread(target=self.update)self.thread.start()def update(self):while self.running:ret, frame = self.cap.read()if ret:with self.lock:  # 确保线程安全self.frame = framedef read(self):with self.lock:  # 确保线程安全return self.framedef stop(self):self.running = Falseself.thread.join()self.cap.release()# 使用示例
video_capture = VideoCaptureThread()while True:frame = video_capture.read()if frame is not None:cv2.imshow('Frame', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakvideo_capture.stop()
cv2.destroyAllWindows()

在本例中,读取视频帧放在了一个单独的线程,读取和处理分别单独运行,从而避免了两者速度不一致导致的读取延迟。


总结

本篇介绍了两种解决摄像头延迟的方法。在读取到图像后,接下来要做的就是图像处理了,下期将介绍图像的各种色彩空间。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com