gpt4 book ai didi

node.js - 如何禁用 OpenCV 相机中的缓冲区?

转载 作者:搜寻专家 更新时间:2023-11-01 00:03:48 24 4
gpt4 key购买 nike

我遇到过这种情况,我使用 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();
}

我的问题是:

是否可以一起删除缓冲区?如果是这样,如何。如果没有,将不胜感激为什么

最佳答案

是否支持 CAP_PROP_BUFFERSIZE 似乎完全取决于操作系统和后端。例如,2.4 docs根据 code,声明它“目前仅受 DC1394 [Firewire] v 2.x 后端支持”,对于后端 V4L , 仅在 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 类中,并通过队列与主线程通信。

answer建议在阅读器线程中使用 cap.grab(),但文档不保证 grab() 会清除缓冲区,因此这在某些情况下可能有效,但在某些情况下无效其他。

关于node.js - 如何禁用 OpenCV 相机中的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54460797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com