RTSP/GB28181/HIKSDK/Ehome协议视频平台EasyCVR使用OpenCV 从内存中构建 Mat 数据说明

在 EasyCVR 图片处理功能中,采用了 OpenCV 进行了图片处理。OpenCV 是一个基于 BSD 许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。

EasyCVR架构图 2.5D.png

在使用 OpenCV 上,一般直接使用cv::imread(file_path.c_str());方法构建 cv::Mat 数据进行处理。此种方法是从磁盘中的文件中读取数据后构建 cv::Mat,即处理顺序为:

  1. 首先其他模块将图片数据写入到磁盘文件中;
  2. 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等设备,最大程度的提高了硬件设备的兼容性。

EasyCVR后台管理视频调阅录像回看视图列表播放.png

关于安防视频云服务EasyCVR相关内容,大家可以参考EasyCVR如何配置接入设备EasyCVR如何接入海康硬盘录像机等。如有需要,欢迎联系。

猜你喜欢

转载自blog.csdn.net/TsingSee/article/details/109032665