关键词:nihui、opencv、 opencv-mobile、 cpu、 性能、 负载
链接:opencv-mobile
一. 引言
近期在7代i5WIN系统工控机中部署项目,发现使用官方原版的opencv对cpu负载高且挤压了其它程序运行资源,经过我仔细debug调整可以进行压缩空间发现可以对opencv进行替代。这里我使用nihui姐姐的opencv-mobile完美的适配项目中的部分函数功能,写以此文致谢nihui姐姐以及顺道比对一下二者差异地方。
基础简介
这部分为大家简单介绍工控机的基础环境、mobile-opencv信息 、比对方法。由于我是在win系统中进行操作更改项目,详细的配置信息如下:
对于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测试记录:
opencv-mobile测试记录:
结果分析
分别对opencv和opencv-mobile的计算耗时进行比对可以得到他们的耗时均值分别为0.0009664556和0.000720543 。也就是说opencv-mobile相较于opencv的耗时压缩了25.44%的时间。如果大家没把opencv添加到系统环境中的话,二者还有一个更直观的差别就是opencv生成exe后需要把opencv的dll文件迁移到同目录下然后opencv-mobile则不需要。这是因为opencv-mobile是采用静态链接库,没有使用动态链接库,直接将所使用的函数部分拆分各个lib库。