我没有做什么特别的,但我阅读OpenCV的文档,我无法理解的方法之间的差异read,并grab从VideoCapture这里该他们做了什么:
抓取:方法/函数从视频文件或相机中抓取下一帧并在成功的情况下返回真(非零)。
读取:解码并返回下一个视频帧。
在这两种方法中提取下一帧。有什么不同?链接到文档
m__*_*__z 11
当仔细查看这两种方法中的每一种的文档时,有一个微妙但显着的差异变得更加明显。
grab “仅”从相机获取图像并保存以进行进一步处理:
这些方法/函数从视频文件或相机中获取下一帧,并在成功的情况下返回 true(非零)。[...] 您
VideoCapture::grab()为每个摄像头调用,然后调用较慢的方法VideoCapture::retrieve()来解码并从每个摄像头获取帧。
在这种情况下,您仍然必须从 OpenCV 检索帧(即“解码并获取”),以便您可以使用它。grab只返回一个布尔值,指示 OpenCV 是否能够从相机获取帧 - 在这种情况下,返回参数不是帧。
read将grab和retrieve操作合并为一个命令并返回已解码的帧:
方法/函数结合在一起,
VideoCapture::grab()并VideoCapture::retrieve()在一次调用中。这是读取视频文件或从解码中捕获数据并返回刚刚抓取的帧的最方便的方法。如果没有抓取到任何帧(相机已断开连接,或者视频文件中没有更多帧),则方法返回 false,函数返回 NULL 指针。
此方法将实际帧返回给您的应用程序,因此您不必担心检查布尔参数并编写额外的代码行以通过 OpenCV 取回帧。
根据您的应用程序,它可能更容易使用,read因为它可能会为您节省一两行代码。
小智 8
添加关于已接受答案的一些信息:另外,从 openCV 文档中阅读,如果您需要同步来自不同设备的图像并且没有连接相机的触发器,则应该使用抓取。
grab()花费的时间比 少read(),因此您应该稍后使用grab()所有设备(读取时间会更接近)并retrieve()在每一帧之后使用它们。同样,如果您需要同步源,对于定制立体相机等应用程序,这非常有用。
while True:
# grab all devices
device1.grab()
device2.grab()
...
# retrieve them later
device1.retrieve(frame_dev1)
device2.retrieve(frame_dev2)
...
Run Code Online (Sandbox Code Playgroud)