首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV -从摄像头读取时的缓冲区尺寸

OpenCV -从摄像头读取时的缓冲区尺寸
EN

Stack Overflow用户
提问于 2020-04-08 17:52:27
回答 1查看 193关注 0票数 1

我正在实现一个对象检测算法,使用OpenCV从我的摄像头读取一个实时流,并且我有一个关于在这个过程中如何在内存中读取/存储帧的一般性问题。

代码的总体结构如下:

代码语言:javascript
运行
复制
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)
    [...]

因此,基本上,代码一直在执行这个循环:

从webcam;

  • passing读取一个帧--这个框架通过神经network;

  • showing --被分析的框架与对象的结果-- detection.

  • after --完成,继续到下一个帧

然而,分析的“下一个帧”并不是按照刚才处理的帧顺序排列的帧,而是当前从摄像机实时流中读取的帧。

另一方面,当从视频文件读取时,所有帧都是按顺序读取的,因此,我的程序的输出与视频的“正常”流之间的差距越来越大。

当我阅读一个文件时,我如何再现相机的行为?换句话说,在读取文件时,我想:

  • 在t0上读取帧0;
  • 分析frame0,该过程需要时间
  • 处理frame0,不分析frame1,而是对应于时间t0+delta_t

的视频帧。

我之所以问这个问题,是因为我必须在虚拟机上运行对象检测器,从远程摄像头读取视频文件,我担心如果我将视频流发送到虚拟机,它将被视为视频文件并进行顺序分析,而我希望减少对象检测和实时流之间的滞后。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-08 19:07:32

这是一个很好的问题,据我所相信,当您运行cap.read()时,OpenCV会在这个例子中从缓冲区捕获帧并继续执行程序。

因此,一旦执行了管道,只有在执行cap.read()时才能捕捉到摄像机中的帧。

如果希望按时间顺序处理图像帧,则应尝试:

  • 在不同的线程中运行捕获和读取。
  • 将捕获的帧附加到堆栈中。
  • 使用堆栈中的框架执行推理。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61106946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档