您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何解析RTSP協(xié)議視頻平臺EasyCVR使用OpenCV 從內(nèi)存中構建Mat數(shù)據(jù),小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
在 EasyCVR 圖片處理功能中,采用了 OpenCV 進行了圖片處理。OpenCV 是一個基于 BSD 許可(開源)發(fā)行的跨平臺計算機視覺和機器學習軟件庫,可以運行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。
在使用 OpenCV 上,一般直接使用cv::imread(file_path.c_str());方法構建 cv::Mat 數(shù)據(jù)進行處理。此種方法是從磁盤中的文件中讀取數(shù)據(jù)后構建 cv::Mat,即處理順序為:
首先其他模塊將圖片數(shù)據(jù)寫入到磁盤文件中;
OpenCV 將磁盤文件加載到內(nèi)存中構建 Mat 數(shù)據(jù)。
此種方法缺點如下,首先在磁盤的讀寫上消耗了性能,其次其他模塊消耗了一次內(nèi)存,OpenCV 模塊也消耗了一次內(nèi)存。
因為其他模塊已經(jīng)將對應的圖片數(shù)據(jù)加載在內(nèi)存中,因此直接將此部分數(shù)據(jù)傳遞給 OpenCV 模塊,就可極大的加快處理速度。主要使用cv::imdecode(data, CV_LOAD_IMAGE_COLOR)方法構建 Mat 數(shù)據(jù)。
以下為具體代碼:
string fname = "D:/image.jpg"; //! 以二進制流方式讀取圖片到內(nèi)存 FILE* pFile = fopen(fname.c_str(), "rb"); fseek(pFile, 0, SEEK_END); long lSize = ftell(pFile); rewind(pFile); char* pData = new char[lSize]; fread(pData, sizeof(char), lSize, pFile); fclose(pFile); //! 解碼內(nèi)存數(shù)據(jù),變成cv::Mat數(shù)據(jù) cv::Mat img_decode; vector<uchar> data; for (int i = 0; i < lSize; ++i){ data.push_back(pData[i]); } img_decode = cv::imdecode(data, CV_LOAD_IMAGE_COLOR); cv::flip(img_decode, img_decode, -1); img_decode.channels(); //! 將cv::Mat數(shù)據(jù)編碼成數(shù)據(jù)流 vector<unsigned char> img_encode; cv::imencode(".jpg", img_decode, img_encode); unsigned char *encode_data = new unsigned char[lSize]; for (int i = 0; i<lSize; i++){ encode_data[i] = img_encode[i]; }
首先從文件中讀取數(shù)據(jù),并加載到內(nèi)存中。此部分和 OpenCV 完全無關,可以由其他模塊進行設計。data 為存儲內(nèi)存的數(shù)據(jù)。最終直接調(diào)用 cv::imdecode 就構建成功。
EasyCVR視頻解決方案分為設備端、服務端、客戶端三個部分,設備端位于局域網(wǎng),服務端及客戶端位于互聯(lián)網(wǎng),支持傳統(tǒng)網(wǎng)絡攝像機、NVR、編碼器、SDK等設備,最大程度的提高了硬件設備的兼容性。
以上就是如何解析RTSP協(xié)議視頻平臺EasyCVR使用OpenCV 從內(nèi)存中構建Mat數(shù)據(jù),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。