pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

由于捕獲緩沖區,OpenCV VideoCapture 滯后

OpenCV VideoCapture lag due to the capture buffer(由于捕獲緩沖區,OpenCV VideoCapture 滯后)
本文介紹了由于捕獲緩沖區,OpenCV VideoCapture 滯后的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我正在通過提供 mjpeg 流的網絡攝像頭捕獲視頻.我在工作線程中進行了視頻捕獲.我這樣開始捕獲:

I am capturing video through a webcam which gives a mjpeg stream. I did the video capture in a worker thread. I start the capture like this:

const std::string videoStreamAddress = "http://192.168.1.173:80/live/0/mjpeg.jpg?x.mjpeg";
qDebug() << "start";
cap.open(videoStreamAddress);
qDebug() << "really started";
cap.set(CV_CAP_PROP_FRAME_WIDTH, 720);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 576);

相機以 20fps 的速度饋送視頻流.但是如果我像這樣以 20fps 的速度閱讀:

the camera is feeding the stream at 20fps. But if I did the reading in 20fps like this:

if (!cap.isOpened()) return;

        Mat frame;
        cap >> frame; // get a new frame from camera
        mutex.lock();

        m_imageFrame = frame;
        mutex.unlock();

然后有 3 秒以上的延遲.原因是采集到的視頻首先存放在一個緩沖區中.當我第一次啟動相機時,緩沖區是累積的,但我沒有把幀讀出來.所以如果我從緩沖區讀取它總是給我舊的幀.我現在唯一的解決方案是以 30fps 讀取緩沖區,這樣它就會快速清理緩沖區,并且不會出現更嚴重的延遲.

Then there is a 3+ seconds lag. The reason is that the captured video is first stored in a buffer.When I first start the camera, the buffer is accumulated but I did not read the frames out. So If I read from the buffer it always gives me the old frames. The only solutions I have now is to read the buffer at 30fps so it will clean the buffer quickly and there's no more serious lag.

有沒有其他可能的解決方案,以便我每次啟動相機時都可以手動清理/刷新緩沖區?

Is there any other possible solution so that I could clean/flush the buffer manually each time I start the camera?

推薦答案

OpenCV 解決方案

根據這個源,您可以設置cv::VideoCapture 對象的緩沖區大小.

OpenCV Solution

According to this source, you can set the buffersize of a cv::VideoCapture object.

cv::VideoCapture cap;
cap.set(CV_CAP_PROP_BUFFERSIZE, 3); // internal buffer will now store only 3 frames

// rest of your code...

但是有一個重要的限制:

There is an important limitation however:

CV_CAP_PROP_BUFFERSIZE 存儲在內部緩沖存儲器中的幀數(注意:目前僅支持 DC1394 v 2.x 后端)

CV_CAP_PROP_BUFFERSIZE Amount of frames stored in internal buffer memory (note: only supported by DC1394 v 2.x backend currently)

從評論中更新.在較新版本的 OpenCV (3.4+) 中,限制似乎消失了,代碼使用了作用域枚舉:

Update from comments. In newer versions of OpenCV (3.4+), the limitation seems to be gone and the code uses scoped enumerations:

cv::VideoCapture cap;
cap.set(cv::CAP_PROP_BUFFERSIZE, 3);

<小時>

解決方法 1

如果解決方案不起作用,請查看這篇博文 解釋了如何解決這個問題.


Hackaround 1

If the solution does not work, take a look at this post that explains how to hack around the issue.

簡而言之:測量查詢一幀所需的時間;如果它太低,則表示該幀是從緩沖區中讀取的,可以丟棄.繼續查詢幀,直到測量的時間超過某個限制.發生這種情況時,緩沖區為空,返回的幀是最新的.

In a nutshell: the time needed to query a frame is measured; if it is too low, it means the frame was read from the buffer and can be discarded. Continue querying frames until the time measured exceeds a certain limit. When this happens, the buffer was empty and the returned frame is up to date.

(鏈接帖子上的答案顯示:從緩沖區返回幀的時間大約是返回最新幀的時間的 1/8.當然,您的里程可能會有所不同!)

(The answer on the linked post shows: returning a frame from the buffer takes about 1/8th the time of returning an up to date frame. Your mileage may vary, of course!)

一個不同的解決方案,靈感來自這篇帖子, 是創建第三個線程,高速連續抓取幀,保持緩沖區為空.這個線程應該使用 cv::VideoCapture.grab() 以避免開銷.

A different solution, inspired by this post, is to create a third thread that grabs frames continuously at high speed to keep the buffer empty. This thread should use the cv::VideoCapture.grab() to avoid overhead.

您可以使用一個簡單的自旋鎖來同步真正的工作線程和第三個線程之間的閱讀幀.

You could use a simple spin-lock to synchronize reading frames between the real worker thread and the third thread.

這篇關于由于捕獲緩沖區,OpenCV VideoCapture 滯后的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Assertion failed (size.widthgt;0 amp;amp; size.heightgt;0)(斷言失敗(size.width0 amp;amp; size.height0))
Rotate an image in C++ without using OpenCV functions(在 C++ 中旋轉圖像而不使用 OpenCV 函數)
OpenCV: process every frame(OpenCV:處理每一幀)
Why can#39;t I open avi video in openCV?(為什么我不能在 openCV 中打開 avi 視頻?)
OpenCV unable to set up SVM Parameters(OpenCV 無法設置 SVM 參數)
Convert a single color with cvtColor(使用 cvtColor 轉換單一顏色)
主站蜘蛛池模板: 盐水蒸发器,水洗盐设备,冷凝结晶切片机,转鼓切片机,絮凝剂加药系统-无锡瑞司恩机械有限公司 | 北京公司注册_代理记账_代办商标注册工商执照-企力宝 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | 化工ERP软件_化工新材料ERP系统_化工新材料MES软件_MES系统-广东顺景软件科技有限公司 | 自动化展_机器人展_机床展_工业互联网展_广东佛山工博会 | 培训中心-海南香蕉蛋糕加盟店技术翰香原中心官网总部 | 氧化锆陶瓷_氧化锆陶瓷加工_氧化锆陶瓷生产厂家-康柏工业陶瓷有限公司 | 在线钠离子分析仪-硅酸根离子浓度测定仪-油液水分测定仪价格-北京时代新维测控设备有限公司 | C形臂_动态平板DR_动态平板胃肠机生产厂家制造商-普爱医疗 | 抓斗式清污机|螺杆式|卷扬式启闭机|底轴驱动钢坝|污水处理闸门-方源水利机械 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 证券新闻,热播美式保罗1984第二部_腾讯1080p-仁爱影院 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 高压互感器,电流互感器,电压互感器-上海鄂互电气科技有限公司 | 水冷散热器_水冷电子散热器_大功率散热器_水冷板散热器厂家-河源市恒光辉散热器有限公司 | 冷镦机-多工位冷镦机-高速冷镦机厂家-温州金诺机械设备制造有限公司 | 新疆十佳旅行社_新疆旅游报价_新疆自驾跟团游-新疆中西部国际旅行社 | 代理记账_免费注册公司_营业执照代办_资质代办-【乐财汇】 | 防爆电机_防爆电机型号_河南省南洋防爆电机有限公司 | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | 无压烧结银_有压烧结银_导电银胶_导电油墨_导电胶-善仁(浙江)新材料 | 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 棕刚玉-白刚玉厂家价格_巩义市东翔净水材料厂 | 东莞压铸厂_精密压铸_锌合金压铸_铝合金压铸_压铸件加工_东莞祥宇金属制品 | 锤式粉碎机,医药粉碎机,锥式粉碎机-无锡市迪麦森机械制造有限公司 | 铝板冲孔网,不锈钢冲孔网,圆孔冲孔网板,鳄鱼嘴-鱼眼防滑板,盾构走道板-江拓数控冲孔网厂-河北江拓丝网有限公司 | CCE素质教育博览会 | CCE素博会 | 教育展 | 美育展 | 科教展 | 素质教育展 | 广东成考网-广东成人高考网| 工作心得_读书心得_学习心得_找心得体会范文就上学道文库 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 不锈钢水箱生产厂家_消防水箱生产厂家-河南联固供水设备有限公司 | 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 游动电流仪-流通式浊度分析仪-杰普仪器(上海)有限公司 | 车牌识别道闸_停车场收费系统_人脸识别考勤机_速通门闸机_充电桩厂家_中全清茂官网 | 淄博不锈钢,淄博不锈钢管,淄博不锈钢板-山东振远合金科技有限公司 | 上海小程序开发-上海小程序制作公司-上海网站建设-公众号开发运营-软件外包公司-咏熠科技 | 蓄电池在线监测系统|SF6在线监控泄露报警系统-武汉中电通电力设备有限公司 | 万家财经_财经新闻_在线财经资讯网 | 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) |