作者colddieyou (隐藏)
看板C_and_CPP
标题[问题] opencv如何以callback方式撷取影像
时间Tue May 2 15:54:53 2023
最近想藉由opencv的影像撷取函式库来撷取USB camera输出每个不重复的frame
查了opencv doc相关章节描述如下
virtual bool cv::VideoCapture::read(OutputArray image)
Grabs, decodes and returns the next video frame.
Parameters
[out] image the video frame is returned here. If no frames has been
grabbed the image will be empty.
Returns
false if no frames has been grabbed
原本以为以read的方式也是frame base 去polling
(从frame buffer抓完一个frame後就从buffer清掉该frame
下一次polling会抓到下个frame)
预期当我把camera关掉并停止输出frame後,read应该要抓到empty image
但实际上用image.empty()去检查抓到的image都不是empty
如此一来用polling的方式撷图就会撷到重覆的frame
我看网路上其他范例也都是使用方法也都是由cpature.read方式不断polling frame
想请问opencv是否有办法藉由callback方式撷取影像
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.146.93.200 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1683014095.A.7C8.html
1F:→ firejox: 你对 frame buffer 是不是有什麽误解 05/03 07:53
2F:→ colddieyou: 有什麽误解的话还请赐教QQ 05/03 11:25
3F:→ firejox: frame buffer 就是完整一块,你能不能抓到新的 frame 是 05/03 12:23
4F:→ firejox: 要看硬体同步的情形。摄影机会决定 frame 是否更新,不 05/03 12:23
5F:→ firejox: 是由 polling 决定。 05/03 12:23
6F:→ colddieyou: 我说法可能让你误会,我的意思是函式定义是抓下一张 05/03 13:13
7F:→ colddieyou: frame,所以我预期他抓完应该会跳下一张,假如我已经 05/03 13:14
8F:→ colddieyou: 假如我把输入源关掉,那应该下一次抓就要是empty 05/03 13:15
9F:→ colddieyou: 但实验结果是opencv没有对frame buffer已经处理过的 05/03 13:16
10F:→ colddieyou: frame做清除动作,这样用polling的方式就会抓到重复的 05/03 13:17
11F:→ colddieyou: 这样opencv用polling方式就没办法达成目的 05/03 13:18
12F:→ colddieyou: 所以我才上来询问是否有其他作法可以达成目标 05/03 13:19
13F:→ lycantrope: grab後retrieve? 05/03 20:45
14F:→ colddieyou: read就包含grab+retrieve,不过我也试过单纯polling 05/03 22:25
15F:→ colddieyou: bool ret=grab()但当输入源关掉後,always ret==true 05/03 22:28
16F:→ firejox: 你怎麽关输入源的 05/03 23:29
17F:→ colddieyou: 直接拔线 05/04 10:54
18F:→ colddieyou: 将输入端的HDMI线直接拔除 05/04 10:56