减少OpenCV读取高分辨率图像的时间示例

 更新时间:2019年12月12日 09:31:19   作者:ssuper_bin  
今天小编就为大家分享一篇减少OpenCV读取高分辨率图像的时间示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

意义

目前无论是工业上还是生活中相机的分辨率也会越来越高,无论是学术上还是工业上使用OpenCV进行图像处理,特别是大批量处理的时候,读取一张高分辨率图像到内存中的时间减少的话对大批量的图像处理的效率有大大的帮助,特别现在全景图越来越普遍,好了,废话不少说。

原理-分块并行加载

大家都知道OpenCV有cvLoadImage或者imread都能够读取外存上的图片到内存里面来,不过如果碰到大规模的图片和高分辨率图片进行加载的时候,比如一张4K或者8K图片,受画家画大图是分块画的想法,我们可以先把图片给分割开来,比如4K的我们把它分割成4*4的小块,然后利用OMP进行并行处理,这样就能把读一张4K利用OMP降低到读一个更小的图像块的时间上,或者你也可以CMAKE出来OpenCV的源码自己在内部进行并行加载,不过个人不太推荐动源码再编译。下面给出读取一张全景图用本身读取和分块异步读取的时间比较代码。

代码

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp> 
#include <time.h>
#include <omp.h>
using namespace cv;

IplImage *showImage = cvCreateImage(cvSize(4096, 2048), IPL_DEPTH_8U, 3);
time_t t_start, t_end;
int main()
{
 t_start = clock();
 IplImage *image = cvLoadImage("0.jpg");
 t_end = clock();
 printf("直接读取一张4K图片花费时间为:%d\n", t_end - t_start);
 t_start = t_end;
 char imgName[4][4][40];
 IplImage *splitImg[4][4];
 #pragma omp parallel for
 for (int i = 1; i <= 4; i++)
 {
  for (int j = 1; j <= 4; j++)
  {
   sprintf_s(imgName[i][j], "%d%d%s", i, j, ".jpg");
   splitImg[i-1][j-1] = cvLoadImage(imgName[i][j]);
   cvSetImageROI(showImage, cvRect((j - 1) * 4096 / 4, (i - 1) * 2048 / 4, 4096 / 4, 2048 / 4));
   cvCopy(splitImg[i - 1][j - 1], showImage);
   cvResetImageROI(showImage);
  }
 }
 t_end = clock();

 printf("分步读取一张4K图片花费时间为:%d", t_end - t_start);
 cvShowImage("test.jpg", showImage);
 cvWaitKey(1);
 getchar();
 return 1;
}

在Visual Studio里面配置一下OpenMP支持

然后读取这张4K图片的时间打印出来如下:

结论

时间快了三倍多,不过和我的想法出入还是挺大的,CPU是i7-4790 8核,按道理不会只快三倍多,后来查了相关的资料,道理也慢慢悟出来一点,因为这篇算工作乏累的随笔,就不阐述很多了。

以上这篇减少OpenCV读取高分辨率图像的时间示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言实现可增容动态通讯录详细过程

    C语言实现可增容动态通讯录详细过程

    这篇文章主要为大家介绍了C语言实现简易通讯录的完整流程,此通讯录还可以增容,并且每个环节都有完整代码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-05-05
  • 详解C++成员函数的override和final说明符的用法

    详解C++成员函数的override和final说明符的用法

    这篇文章主要介绍了详解C++成员函数的override和final说明符的用法,分别用于重写和禁止继承类,要的朋友可以参考下
    2016-01-01
  • 详解C++ const修饰符

    详解C++ const修饰符

    const 是 constant 的缩写,const可以帮我们避免无意之中的错误操作,本文给大家介绍C++ const修饰符的相关知识,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-05-05
  • C++程序简单示例

    C++程序简单示例

    这篇文章主要给大家分享的是C++程序简单示例,下面文章将围绕C++程序的相关资料展开内容,需要的朋友可以参考一下,希望对你有所帮助
    2021-11-11
  • 老生常谈C语言中指针的使用

    老生常谈C语言中指针的使用

    这篇文章主要为大家详细介绍了C语言中指针的使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++ vector使用的一些注意事项

    C++ vector使用的一些注意事项

    这篇文章主要给大家介绍了关于C++ vector使用的一些注意事项,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 关于C语言位运算的简单示例

    关于C语言位运算的简单示例

    这篇文章主要介绍了关于C语言位运算的简单示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • c语言内存泄露示例解析

    c语言内存泄露示例解析

    从1988年著名的莫里斯蠕虫 攻击到有关 Flash Player 和其他关键的零售级程序的最新安全警报都与缓冲区溢出有关:“大多数计算机安全漏洞都是缓冲区溢出”,Rodney Bates 在 2004 年写道
    2013-09-09
  • 详解C++11中的lambda匿名函数

    详解C++11中的lambda匿名函数

    匿名函数,简单地理解就是没有名称的函数,又常被称为 lambda 函数或者 lambda 表达式,这篇文章主要介绍了C++11中的lambda匿名函数,需要的朋友可以参考下
    2022-11-11
  • C/C++杂记 虚函数的实现的基本原理(图文)

    C/C++杂记 虚函数的实现的基本原理(图文)

    这篇文章主要介绍了C/C++杂记 虚函数的实现的基本原理(图文),需要的朋友可以参考下
    2016-06-06

最新评论