[問題] opencv如何以callback方式擷取影像

作者: colddieyou (隱藏)   2023-05-02 15:54:53
最近想藉由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方式擷取影像
作者: firejox (Tangent)   2023-05-03 07:53:00
你對 frame buffer 是不是有什麼誤解
作者: colddieyou (隱藏)   2023-05-03 11:25:00
有什麼誤解的話還請賜教QQ
作者: firejox (Tangent)   2023-05-03 12:23:00
frame buffer 就是完整一塊,你能不能抓到新的 frame 是要看硬體同步的情形。攝影機會決定 frame 是否更新,不是由 polling 決定。
作者: colddieyou (隱藏)   2023-05-03 13:13:00
我說法可能讓你誤會,我的意思是函式定義是抓下一張frame,所以我預期他抓完應該會跳下一張,假如我已經假如我把輸入源關掉,那應該下一次抓就要是empty但實驗結果是opencv沒有對frame buffer已經處理過的frame做清除動作,這樣用polling的方式就會抓到重複的這樣opencv用polling方式就沒辦法達成目的所以我才上來詢問是否有其他作法可以達成目標
作者: lycantrope (阿寬)   2023-05-03 20:45:00
grab後retrieve?
作者: colddieyou (隱藏)   2023-05-03 22:25:00
read就包含grab+retrieve,不過我也試過單純pollingbool ret=grab()但當輸入源關掉後,always ret==true
作者: firejox (Tangent)   2023-05-03 23:29:00
你怎麼關輸入源的
作者: colddieyou (隱藏)   2023-05-04 10:54:00
直接拔線將輸入端的HDMI線直接拔除
作者: lycantrope (阿寬)   2023-05-04 14:20:00

Links booklink

Contact Us: admin [ a t ] ucptt.com