如何禁用 OpenCV 相机中的缓冲区?

2023-12-30

我遇到过这种情况,我使用 OpenCV 来检测相机前面的人脸,并对这些人脸进行一些机器学习。我遇到的问题是,一旦我完成所有处理,并去抓取下一帧,我得到的是过去,而不是现在。意思是,我将读取缓冲区内的内容,而不是实际在相机前面的内容。由于我不关心处理时哪些面孔出现在相机前面,所以我关心现在出现在相机前面的内容。

我确实尝试将缓冲区大小设置为1,这确实有很大帮助,但我仍然会得到至少 3 个缓冲区读取。将 FPS 设置为 1,也并不能帮助 100% 消除这种情况。以下是我的流程。

let cv = require('opencv4nodejs');

let camera = new cv.VideoCapture(camera_port);

camera.set(cv.CAP_PROP_BUFFERSIZE, 1);
camera.set(cv.CAP_PROP_FPS, 2);
camera.set(cv.CAP_PROP_POS_FRAMES , 1);

function loop()
{
    //
    //  <>> Grab one frame from the Camera buffer.
    //
    let rgb_mat = camera.read();

    //  Do to gray scale

    //  Do face detection

    //  Crop the image

    //  Do some ML stuff

    //  Do whats needs to be done after the results are in.

    //
    //  <>> Release data from memory
    //
    rgb_mat.release();

    //
    //  <>> Restart the loop
    //
    loop();
}

我的问题是:

是否可以将缓冲区全部删除?如果是这样,又是怎样的。如果没有,则why将不胜感激。


Whether CAP_PROP_BUFFERSIZE支持看起来相当特定于操作系统和后端。例如,2.4 docs https://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture-get声明它“目前仅受 DC1394 [Firewire] v 2.x 后端支持”,并且对于后端 V4L,根据code https://github.com/opencv/opencv/blob/3.4.5/modules/videoio/src/cap_v4l.cpp#L164,仅于 2018 年 3 月 9 日添加支持。

禁用缓冲区的最简单的非脆弱方法是使用单独的线程;有关详细信息,请参阅 Piotr Kurowski 的回答下我的评论。这里的Python代码使用单独的线程来实现无缓冲的VideoCapture:(我没有opencv4nodejs环境。)

import cv2, Queue, threading, time

# bufferless VideoCapture
class VideoCapture:

  def __init__(self, name):
    self.cap = cv2.VideoCapture(name)
    self.q = Queue.Queue()
    t = threading.Thread(target=self._reader)
    t.daemon = True
    t.start()

  # read frames as soon as they are available, keeping only most recent one
  def _reader(self):
    while True:
      ret, frame = self.cap.read()
      if not ret:
        break
      if not self.q.empty():
        try:
          self.q.get_nowait()   # discard previous (unprocessed) frame
        except Queue.Empty:
          pass
      self.q.put(frame)

  def read(self):
    return self.q.get()

cap = VideoCapture(0)
while True:
  frame = cap.read()
  time.sleep(.5)   # simulate long processing
  cv2.imshow("frame", frame)
  if chr(cv2.waitKey(1)&255) == 'q':
    break

帧读取器线程封装在自定义内部VideoCapture类,与主线程的通信是通过队列进行的。

This answer https://stackoverflow.com/a/30032945/1628638建议使用cap.grab()在读者线程中,但文档不保证grab()清除缓冲区,因此这可能在某些情况下有效,但在其他情况下无效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何禁用 OpenCV 相机中的缓冲区? 的相关文章

随机推荐

  • 如果任何列与一组值之一匹配,则保留行

    我有一个关于使用 R 进行子集化的简单问题 我想我已经很接近了 但还不太明白 基本上 我有 25 个感兴趣的列和大约 100 个值 我想保留其中一列中具有任何这些值的任何行 简单的例子 Values lt c 1 2 5 col1 lt c
  • AngularJS - 在 Angular 中声明服务的不同方式的主要区别是什么?

    我正在开发一个 AngularJS 应用程序 并试图坚持 AngularJs 中最有效和最广泛接受的开发风格 目前 我正在使用这种方式声明我的服务 如下所示 app factory MyService function function d
  • 创建对 IObservable 的弱订阅

    我想要做的是确保如果对我的观察者的唯一引用是可观察的 它会被垃圾收集并停止接收消息 假设我有一个带有列表框的控件 称为 消息 后面的代码如下 Short lived display of messages only while the us
  • jquery lavalamp 的问题

    由于某种原因 无论我点击哪个链接 我的背景颜色都会回到最左边的链接 有人知道如何让它保留在点击的链接上吗 css lamp float left margin 25px 0px 0px 90px clear both lavaLamp po
  • 异步编程 APM 与 EAP

    实际上有什么区别异步编程模型 and 基于事件的异步模式 使用哪种方法以及何时使用 The 异步编程模型 APM 是您看到的模型BeginMethod and EndMethod pairs 例如这里是一个Socket使用APM执行 var
  • 如果 Moose 构建器方法失败该怎么办?

    处理构建器方法中的失败的最佳方法是什么 例如 package MyObj use Moose use IO File has gt file name is gt ro isa gt Str required gt 1 has gt fil
  • 使用时间窗口的标签回填缺失数据

    我想根据时间 1天 2天 用不同的标签回填每一列 这是代码 from datetime import datetime timedelta import pandas as pd import numpy as np import rand
  • NSToolbar的标签区域可以画图吗?

    我有一个NSToolbarItem它使用类似于 Xcode 状态视图的视图 它目前没有标签 但我无法找到一种方法来绘制通常绘制项目标签的区域 我希望该视图能够像 Xcode 状态视图一样扩展到该区域 我知道像素的最底部部分NSToolbar
  • 将列表转储到 pickle 文件中并稍后检索[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试保存字符串列表 以便以后可以访问它 使用pickle如何实现呢 一个说明性的例子可能会有所帮助 Pickling 将序列化您的列
  • 使用 Fold 依赖多个先前值来计算线性递归的结果

    I have a linear recurrence problem where the next element relies on more than just the prior value e g the Fibonacci seq
  • 我应该在创建通知之前调用 WakeLock 吗?

    我正在向 Android 应用程序添加通知 目前只有模拟器可供测试 收到通知时 将调用 GCMBaseIntentService 子类 GCMIntentService 中的 onMessage 方法 从这里我创建一个要显示的通知 如果我将
  • Kubernetes集群出站流量IP

    我在 Google Kubernetes Engine 上有一个 Kubernetes 集群 我想为集群的所有传出流量分配一个静态 IP 我已经保留了外部 IP 但无法使用 GCP 控制台将它们分配给集群 我找到了一个使用 cli 执行此操
  • 数据读取器检索数据

    我的数据库中有会员资格和预订表 其中包含属性 cust id 它是会员资格中的主键和预订中的参考键 当我执行数据读取器时 我希望它从会员表中读取 cust id 值 但它是从预订表中读取的 另外 当我比较两个 cust id 值时 1 个取
  • 通过 PayPal iOS SDK 进行 PayPal 实时交易的问题

    我正在为 iPad 开发 iOS 应用程序 版本 7 x 我们需要通过应用程序执行 PayPal 交易 我们包含了 PayPal iOS SDK 并参考他们的示例代码来执行交易 示例代码放置在here https github com pa
  • AWS Lambda 和 .NET Core - 使用 Linux 运行时?

    我正在用 C NET Core 编写 Alexa 技能 以便从 AWS Lambda 函数 在 Amazon Linux 上运行 运行 当我编译项目时 点网发布 我收到错误 找不到框架 NETCoreApp Version v1 0 的运行
  • 需要一点数学帮助来调整图像大小

    我有一个具有 X 宽度和 Y 高度值的图像 现在我想将高度设置为 60px 通过哪种计算我可以计算出图像正确调整大小的高度 我认为你正在努力保持纵横比 如果是这样 请使用以下命令 比率 原始高度 新高度 新宽度 原始宽度 比例
  • 在 Python (Pycharm) 中导入 numpy,安装了 Anaconda

    我对 python 很陌生 我正在尝试编写代码来导出一阶 ODE 因此 我需要某些软件包 例如 numpy 来执行此操作并安装了 Anaconda 当我尝试在 PyCharm 中使用 import numpy 命令时 它不起作用 我收到 M
  • 对产品列表进行分类的算法?拿2

    我问了一个类似的问题 https stackoverflow com questions 695347 algorithm to classify a list of products几周前就问过这个问题 但我没有正确地提出这个问题 所以我
  • 无法将 R 数据帧转换为 Spark DataFrame

    当我尝试使用以下方法将 R 中的本地数据帧转换为 Spark DataFrame 时 raw data lt as DataFrame sc raw data 我收到此错误 17 01 24 08 02 04 警告 RBackendHand
  • 如何禁用 OpenCV 相机中的缓冲区?

    我遇到过这种情况 我使用 OpenCV 来检测相机前面的人脸 并对这些人脸进行一些机器学习 我遇到的问题是 一旦我完成所有处理 并去抓取下一帧 我得到的是过去 而不是现在 意思是 我将读取缓冲区内的内容 而不是实际在相机前面的内容 由于我不