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