【轻量化】工控机中使用opencv-mobile替代opencv实现轻量化部署

148 阅读2分钟

关键词:nihui、opencv、 opencv-mobile、 cpu、 性能、 负载
链接:opencv-mobile

一. 引言

  近期在7代i5WIN系统工控机中部署项目,发现使用官方原版的opencv对cpu负载高且挤压了其它程序运行资源,经过我仔细debug调整可以进行压缩空间发现可以对opencv进行替代。这里我使用nihui姐姐的opencv-mobile完美的适配项目中的部分函数功能,写以此文致谢nihui姐姐以及顺道比对一下二者差异地方。

基础简介

  这部分为大家简单介绍工控机的基础环境、mobile-opencv信息 、比对方法。由于我是在win系统中进行操作更改项目,详细的配置信息如下:

image.png image.png   对于opencv-mobile的简介简单说就是opencv的精简版(简直就是为我这个项目量身打造)保留了核心使用函数,对不可能会用到的函数进行剔除非常适合低配置机器的使用。由于我是win系统,所以我也会在win中进行比对测试。

对比测试

  在这里使用 chrono 库,它是 C++11 标准库的一部分可以很好的统计多次运行resize函数进行计算耗时。

代码部分:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <chrono>
#include <iostream>

int main()
{
    // 读取图像
    cv::Mat bgr = cv::imread("1920_1080.png", 1);
    if (bgr.empty()) {
        std::cerr << "Could not read the image" << std::endl;
        return 1;
    }

    // 设置目标大小
    cv::Size newSize(640, 480);

    // 用于存储总运行时间
    std::chrono::duration<double> totalDuration(0);

    // 运行多次以计算平均时间
    const int iterations = 10000; // 可以根据需要调整迭代次数
    for (int i = 0; i < iterations; ++i) {
        // 记录开始时间
        auto start = std::chrono::high_resolution_clock::now();

        // 执行resize操作
        cv::Mat resized;
        cv::resize(bgr, resized, newSize);

        // 记录结束时间
        auto end = std::chrono::high_resolution_clock::now();

        // 计算单次运行时间并累加
        totalDuration += (end - start);
    }

    // 计算平均运行时间
    auto averageDuration = totalDuration / iterations;
    std::cout << "Average time for cv::resize: "
        << averageDuration.count() << " seconds" << std::endl;



    return 0;
}

opencv测试记录: image.png

opencv-mobile测试记录: image.png

结果分析

  分别对opencv和opencv-mobile的计算耗时进行比对可以得到他们的耗时均值分别为0.00096645560.000720543 。也就是说opencv-mobile相较于opencv的耗时压缩了25.44%的时间。如果大家没把opencv添加到系统环境中的话,二者还有一个更直观的差别就是opencv生成exe后需要把opencv的dll文件迁移到同目录下然后opencv-mobile则不需要。这是因为opencv-mobile是采用静态链接库,没有使用动态链接库,直接将所使用的函数部分拆分各个lib库。