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 轉換單一顏色)
主站蜘蛛池模板: 风电变桨伺服驱动器-风电偏航变桨系统-深圳众城卓越科技有限公司 | 汽车整车综合环境舱_军标砂尘_盐雾试验室试验箱-无锡苏南试验设备有限公司 | 动环监控_机房环境监控_DCIM_机房漏水检测-斯特纽 | 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | 电竞馆加盟,沈阳网吧加盟费用选择嘉棋电竞_售后服务一体化 | 移动厕所租赁|移动卫生间|上海移动厕所租赁-家瑞租赁 | 国资灵活用工平台_全国灵活用工平台前十名-灵活用工结算小帮手 | 语料库-提供经典范文,文案句子,常用文书,您的写作得力助手 | 智慧食堂_食堂管理系统_食堂订餐_食堂消费系统—客易捷 | 上海小程序开发-上海小程序制作公司-上海网站建设-公众号开发运营-软件外包公司-咏熠科技 | 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 断桥铝破碎机_发动机破碎机_杂铝破碎机厂家价格-皓星机械 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 贝朗斯动力商城(BRCPOWER.COM) - 买叉车蓄电池上贝朗斯商城,价格更超值,品质有保障! | 活动策划,舞台搭建,活动策划公司-首选美湖上海活动策划公司 | 回转窑-水泥|石灰|冶金-巩义市瑞光金属制品有限责任公司 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 天津电机维修|水泵维修-天津晟佳机电设备有限公司 | 自清洗过滤器-全自动自清洗过反冲洗过滤器 - 中乂(北京)科技有限公司 | 阴离子_阳离子聚丙烯酰胺厂家_聚合氯化铝价格_水处理絮凝剂_巩义市江源净水材料有限公司 | 彭世修脚_修脚加盟_彭世修脚加盟_彭世足疗加盟_足疗加盟连锁_彭世修脚技术培训_彭世足疗 | 振动筛-交叉筛-螺旋筛-滚轴筛-正弦筛-方形摇摆筛「新乡振动筛厂家」 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 纸张环压仪-纸张平滑度仪-杭州纸邦自动化技术有限公司 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 明渠式紫外线杀菌器-紫外线消毒器厂家-定州市优威环保 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 广州企亚 - 数码直喷、白墨印花、源头厂家、透气无手感方案服务商! | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 广西教师资格网-广西教师资格证考试网 | 上海璟文空运首页_一级航空货运代理公司_机场快递当日达 | 全温恒温摇床-水浴气浴恒温摇床-光照恒温培养摇床-常州金坛精达仪器制造有限公司 | 浙江寺庙设计-杭州寺院设计-宁波寺庙规划_汉匠 | 北京公寓出租网-北京酒店式公寓出租平台 | 元拓建材集团官方网站| 生物制药洁净车间-GMP车间净化工程-食品净化厂房-杭州波涛净化设备工程有限公司 | 雪花制冰机(实验室雪花制冰机)百科 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 |