OpenCV - 从网络摄像头读取时的缓冲区尺寸
OpenCV - buffer dimension when reading from webcam
我正在实施一个对象检测算法,使用 OpenCV 从我的网络摄像头读取实时流,并且我有一个关于在该过程中帧如何 read/stored 在内存中的一般性问题。
代码的整体结构是这样的:
cap = cv2.VideoCapture(0)
while(True):
# Load frame from the camera
ret, frame = cap.read()
class_IDs, scores, bounding_boxes = neural_network(frame)
cv2.imshow('window', frame)
[...]
所以,代码基本上是在不断地执行这个循环:
- 正在从网络摄像头读取一帧;
- 通过神经网络传递此帧;
- 显示带有对象检测结果的分析帧。
- 完成后,继续下一帧
然而,"next frame"分析的并不是刚刚处理过的帧的顺序帧,而是当前从相机实时流中读取的帧。
另一方面,当从视频文件中读取时,所有帧都是按顺序读取的,因此我的程序的输出与视频的 "normal" 流之间的延迟越来越大。
如何重现读取文件时的相机行为?换句话说,在读取文件时我想:
- 在 t0 读取第 0 帧;
- 分析frame0,这个过程需要时间delta_t;
- 处理frame0后,DO NOT ANALYZE frame1, but the video frame corresponding to time t0+delta_t
我问是因为我必须 运行 虚拟机上的对象检测器从远程网络摄像头读取视频文件,我担心如果我只是将视频流发送到虚拟机将其视为视频文件并按顺序分析,而我想减少对象检测和实时流之间的延迟。
很好的问题,据我所知,当您 运行 cap.read()
OpenCV 在那个实例点从缓冲区捕获帧并继续执行程序时。
因此,一旦您执行管道,只有在执行 cap.read() 时才会捕获来自相机的帧。
如果您希望相对于时间范围按顺序处理图像帧,您应该尝试:
- 运行 在不同的线程中捕获和读取。
- 将捕获的帧附加到堆栈。
- 使用堆栈中的帧进行推理。
我正在实施一个对象检测算法,使用 OpenCV 从我的网络摄像头读取实时流,并且我有一个关于在该过程中帧如何 read/stored 在内存中的一般性问题。
代码的整体结构是这样的:
cap = cv2.VideoCapture(0)
while(True):
# Load frame from the camera
ret, frame = cap.read()
class_IDs, scores, bounding_boxes = neural_network(frame)
cv2.imshow('window', frame)
[...]
所以,代码基本上是在不断地执行这个循环:
- 正在从网络摄像头读取一帧;
- 通过神经网络传递此帧;
- 显示带有对象检测结果的分析帧。
- 完成后,继续下一帧
然而,"next frame"分析的并不是刚刚处理过的帧的顺序帧,而是当前从相机实时流中读取的帧。
另一方面,当从视频文件中读取时,所有帧都是按顺序读取的,因此我的程序的输出与视频的 "normal" 流之间的延迟越来越大。
如何重现读取文件时的相机行为?换句话说,在读取文件时我想:
- 在 t0 读取第 0 帧;
- 分析frame0,这个过程需要时间delta_t;
- 处理frame0后,DO NOT ANALYZE frame1, but the video frame corresponding to time t0+delta_t
我问是因为我必须 运行 虚拟机上的对象检测器从远程网络摄像头读取视频文件,我担心如果我只是将视频流发送到虚拟机将其视为视频文件并按顺序分析,而我想减少对象检测和实时流之间的延迟。
很好的问题,据我所知,当您 运行 cap.read()
OpenCV 在那个实例点从缓冲区捕获帧并继续执行程序时。
因此,一旦您执行管道,只有在执行 cap.read() 时才会捕获来自相机的帧。
如果您希望相对于时间范围按顺序处理图像帧,您应该尝试:
- 运行 在不同的线程中捕获和读取。
- 将捕获的帧附加到堆栈。
- 使用堆栈中的帧进行推理。