c语言程序降低图像分辨率,减少OpenCV读取高分辨率图像的时间示例

意义

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

原理-分块并行加载

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

代码

#include

#include

#include

#include

#include

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支持

b82cb1b684a63afbaf3d2366d82c0d0d.png

6366b50a42547d6f1094d1735c4df49d.png

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

505db4cd278a9d37e4439fb99b1243ea.png

结论

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值