您好,登錄后才能下訂單哦!
本篇內容主要講解“Qt Onvif抓拍圖片怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Qt Onvif抓拍圖片怎么實現”吧!
抓拍是個很重要的功能,比如在報警視頻聯動中需要一張實時的圖片,很多SDK不提供抓拍功能,而通過預覽抓圖,得到的圖片已不具有實時性,那如何得到實時的圖片呢?現在的IPC基本上都支持ONVIF協議,ONVIF協議除了提供RTSP的URL外,其實也給出了抓拍的URL,從Media的GetSnapshotUri獲取。
以前不知道onvif也可以做抓拍功能,直到近期重新用Onvif Device Test Tool工具測試的時候,發現還有抓圖的接口,于是抓跑分析出要收發的數據,然后加入到自己封裝的onvif操作類中,這個抓圖有個應用場景就是報警以后,直接通過onvif抓圖,而不需要打開實時視頻流,基本上不占用什么資源。
還有一種應用場景是作為圖像智能檢測服務,采集監控攝像機的在線運行狀況,抓拍監控圖像定時上傳至云服務平臺,人工或者智能分析圖片,檢測監控圖像的情況,比如是否位置不正確,是否黑畫面,光照度夠不夠等,發現問題后及時派遣維修人員上門維修,同時監控信息丟失后,也能立即通知維修人員去查看現場等,這就需要用到onvif抓圖,如何檢測設備是否在運行呢,方法比較多,其實可以用onvif協議讀取日期時間,正常的話都會返回一個時間,當然也可以定時搜索一遍所有設備,然后與之前存儲的設備比較,連續多少次少了哪一個就認為掉線。
抓拍圖片流程:
發送GetSnapshotUri獲取到對應token的抓圖路徑。
通過get方式請求這個路徑,注意這里建議帶上用戶信息。
返回的數據就是圖片的數據,接收完成以后用QImage的loadFromData載入即可。
onvif主要的功能:
搜索設備,獲取設備的信息比如廠家、型號等。
獲取設備的多個配置文件信息profile。
獲取對應配置文件的視頻流地址rtsp,以及分辨率等參數。
云臺控制,上下左右移動,焦距放大縮小,相對和絕對移動。
獲取預置位信息,觸發預置位。
訂閱事件,接收設備的各種消息尤其是報警事件比如IO口的報警。
抓圖,獲取設備當前的圖片。
獲取、創建、刪除用戶信息。
獲取和設備網絡配置信息比如IP地址等。
獲取和設置NTP時間同步以及設置設備時間。
獲取和設置視頻參數和圖片參數(亮度、色彩、飽和度)。
重啟設備。
onvif的處理流程:
綁定組播IP(239.255.255.250)和端口(3702),發送固定的xml格式的數據搜索設備。
接收到的xml格式的數據解析,得到設備的Onvif地址。
對Onvif地址發送對應的數據,收到數據取出對應的節點數據。
請求Onvif地址獲取Media地址和Ptz地址,Media地址用來獲取詳細的配置文件,Ptz地址用來云臺控制。
ptz控制是對Ptz地址發送對應的數據即可。
設置了用戶認證的需要組織用戶token信息一塊發送,每次都需要作鑒權處理。
接收到的數據不是標準的xml數據,沒法按照正常的節點解析來處理,只能用QXmlQuery來做。
每個廠家設備返回的數據未必完全一致,基本上都不一致,需要進行模糊查找節點值。
特意采用底層協議解析,因為soap太臃腫函數名稱太另類,特意做的輕量級的。
兩個必備工具,Onvif Device Manager 和 Onvif Device Test Tool。
廣播搜索設備,支持IPC和NVR,依次返回,可選擇不同的網卡IP。
依次獲取Onvif地址、Media地址、Profile文件、Rtsp地址。
可對指定的Profile獲取視頻流Rtsp地址,比如主碼流子碼流地址。
可對每個設備設置Onvif用戶信息,用于認證獲取詳細信息。
可實時預覽攝像機圖像。
支持云臺控制,可上下左右調節云臺,支持絕對移動和相對移動,可放到和縮小圖像遠近。
支持Qt4和Qt5任意Qt版本,親測Qt4.7.0到Qt5.14.2。
支持任意編譯器,親測mingw、msvc、gcc、clang。
支持任意操作系統,親測xp、win7、win10、android、linux、嵌入式linux、樹莓派全志H3等。
支持任意Onvif攝像機和NVR,親測海康、大華、宇視、華為、海思芯片內核等,可定制開發。
支持對指定IP地址及onvif地址進行單播搜索,比如跨網段情況下非常有用。
支持指定過濾條件過濾搜索設備。
支持搜索間隔設置,保證所有設備搜索回來,在大量設備現場很有用。
可對圖片參數(亮度、色彩度、飽和度)進行設置。
支持NTP校時和時間同步設置。
純Qt編寫,超級小巧輕量,總共約2000行代碼,不依賴任何第三方的庫和組件,跨平臺。
封裝好了通用的數據發送和接收解析的函數,可以非常方便的自行拓展其他Onvif處理。
工具上提供了收發數據文本框,顯示收發的數據,方便查看和分析。
支持所有Onvif設備,代碼工整,接口友好,直接引入pri即可使用。
#include "onvifsnap.h" #include "onvifhelper.h" #include "onvifrequest.h" #include "onvifquery.h" OnvifSnap::OnvifSnap(QObject *parent) : QObject(parent) { device = 0; } void OnvifSnap::setDevice(OnvifDevice *device) { this->device = device; } QString OnvifSnap::getSnapshotUri(const QString &profileToken) { if (device->mediaUrl.isEmpty()) { return QString(); } QString file = OnvifHelper::getFile(":/send/getSnapshotUri.xml"); file = file.arg(device->request->getUserToken()).arg(profileToken); QByteArray dataSend = file.toUtf8(); QNetworkReply *reply = device->request->post(device->mediaUrl, dataSend); emit sendData(dataSend, device->mediaUrl); QByteArray dataReceive; bool ok = device->checkData(reply, dataReceive, "請求截圖"); if (ok) { OnvifQuery query; query.setData(dataReceive); device->snapUrl = query.getSnapUrl(); if (!device->snapUrl.isEmpty()) { //重新加上用戶認證,取圖片也需要認證的 emit receiveInfo(QString("抓圖地址-> %1").arg(device->snapUrl)); QString userInfo = QString("http://%1:%2@").arg(device->userName).arg(device->userPwd); device->snapUrl = device->snapUrl.replace("http://", userInfo); } } return device->snapUrl; } QImage OnvifSnap::snapImage(const QString &profileToken) { //這里還可以考慮過濾,比如已經存在了 snapUrl 則不需要去獲取地址 getSnapshotUri(profileToken); QImage image; if (!device->snapUrl.isEmpty()) { //請求圖片數據回復 1080P 大概需要 600ms //默認采用的是同步阻塞獲取,并不會卡主界面 QNetworkReply *reply = device->request->get(device->snapUrl); QByteArray dataReceive; bool ok = device->checkData(reply, dataReceive, "收到截圖", false); if (ok) { //下面這行代碼非常耗時 1080P 圖片大概需要 80ms 如果需要頻繁的截圖建議放入線程處理 image.loadFromData(dataReceive); } } return image; }
到此,相信大家對“Qt Onvif抓拍圖片怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。