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

看板C_and_CPP作者 (隱藏)時間1年前 (2023/05/02 15:54), 編輯推噓0(0019)
留言19則, 3人參與, 1年前最新討論串1/1
最近想藉由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://www.ptt.cc/bbs/C_and_CPP/M.1683014095.A.7C8.html

05/03 07:53, 1年前 , 1F
你對 frame buffer 是不是有什麼誤解
05/03 07:53, 1F

05/03 11:25, 1年前 , 2F
有什麼誤解的話還請賜教QQ
05/03 11:25, 2F

05/03 12:23, 1年前 , 3F
frame buffer 就是完整一塊,你能不能抓到新的 frame 是
05/03 12:23, 3F

05/03 12:23, 1年前 , 4F
要看硬體同步的情形。攝影機會決定 frame 是否更新,不
05/03 12:23, 4F

05/03 12:23, 1年前 , 5F
是由 polling 決定。
05/03 12:23, 5F

05/03 13:13, 1年前 , 6F
我說法可能讓你誤會,我的意思是函式定義是抓下一張
05/03 13:13, 6F

05/03 13:14, 1年前 , 7F
frame,所以我預期他抓完應該會跳下一張,假如我已經
05/03 13:14, 7F

05/03 13:15, 1年前 , 8F
假如我把輸入源關掉,那應該下一次抓就要是empty
05/03 13:15, 8F

05/03 13:16, 1年前 , 9F
但實驗結果是opencv沒有對frame buffer已經處理過的
05/03 13:16, 9F

05/03 13:17, 1年前 , 10F
frame做清除動作,這樣用polling的方式就會抓到重複的
05/03 13:17, 10F

05/03 13:18, 1年前 , 11F
這樣opencv用polling方式就沒辦法達成目的
05/03 13:18, 11F

05/03 13:19, 1年前 , 12F
所以我才上來詢問是否有其他作法可以達成目標
05/03 13:19, 12F

05/03 20:45, 1年前 , 13F
grab後retrieve?
05/03 20:45, 13F

05/03 22:25, 1年前 , 14F
read就包含grab+retrieve,不過我也試過單純polling
05/03 22:25, 14F

05/03 22:28, 1年前 , 15F
bool ret=grab()但當輸入源關掉後,always ret==true
05/03 22:28, 15F

05/03 23:29, 1年前 , 16F
你怎麼關輸入源的
05/03 23:29, 16F

05/04 10:54, 1年前 , 17F
直接拔線
05/04 10:54, 17F

05/04 10:56, 1年前 , 18F
將輸入端的HDMI線直接拔除
05/04 10:56, 18F

05/04 14:20, 1年前 , 19F
文章代碼(AID): #1aKC7FV8 (C_and_CPP)