本篇文章给大家分享的是有关如何解析RTSP协议视频平台EasyCVR使用OpenCV 从内存中构建Mat数据,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
在 EasyCVR 图片处理功能中,采用了 OpenCV 进行了图片处理。OpenCV 是一个基于 BSD 许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。
在使用 OpenCV 上,一般直接使用cv::imread(file_path.c_str());方法构建 cv::Mat 数据进行处理。此种方法是从磁盘中的文件中读取数据后构建 cv::Mat,即处理顺序为:
-
首先其他模块将图片数据写入到磁盘文件中;
-
OpenCV 将磁盘文件加载到内存中构建 Mat 数据。
此种方法缺点如下,首先在磁盘的读写上消耗了性能,其次其他模块消耗了一次内存,OpenCV 模块也消耗了一次内存。
因为其他模块已经将对应的图片数据加载在内存中,因此直接将此部分数据传递给 OpenCV 模块,就可极大的加快处理速度。主要使用cv::imdecode(data, CV_LOAD_IMAGE_COLOR)方法构建 Mat 数据。
以下为具体代码:
string fname = "D:/image.jpg"; //! 以二进制流方式读取图片到内存 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); //! 解码内存数据,变成cv::Mat数据 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数据编码成数据流 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]; }
首先从文件中读取数据,并加载到内存中。此部分和 OpenCV 完全无关,可以由其他模块进行设计。data 为存储内存的数据。最终直接调用 cv::imdecode 就构建成功。
关于EasyCVR融合视频平台
EasyCVR视频解决方案分为设备端、服务端、客户端三个部分,设备端位于局域网,服务端及客户端位于互联网,支持传统网络摄像机、NVR、编码器、SDK等设备,最大程度的提高了硬件设备的兼容性。
以上就是如何解析RTSP协议视频平台EasyCVR使用OpenCV 从内存中构建Mat数据,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
原创文章,作者:1402239773,如若转载,请注明出处:https://blog.ytso.com/223931.html