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

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

RTSP协议视频平台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;
    vectordata;
    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数据编码成数据流
    vectorimg_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 数据说明

 

上一篇:C#中的非托管C类


下一篇:c – 具有二维数组的PInvoke返回结构