欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-04 23:11:14
...

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

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

在使用 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等设备,最大程度的提高了硬件设备的兼容性。

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

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