【短道速滑一】OpenCV中cvResize函数使用双线性插值缩小图像到长宽大小一半时速度飞快(比最近邻还快)之异象解析和自我实现。...

本文深入探讨了OpenCV中双线性插值算法的高效实现,特别是在特定条件下,如源图像尺寸为2的倍数且目标图像尺寸为源图像一半时,算法速度显著提升的原因。通过对算法本质的解析,作者展示了如何利用SSE和AVX指令进行优化,以达到与OpenCV相当甚至更优的性能。

  今天,一个朋友想使用我的SSE优化Demo里的双线性插值算法,他已经在项目里使用了OpenCV,因此,我就建议他直接使用OpenCV,朋友的程序非常注意效率和实时性(因为是处理视频),因此希望我能测试下我的速度和OpenCV相比到底那一个更有速度优势,恰好前一段时间也有朋友有这方面的需求,因此我就随意编写了一个测试程序,如下所示:

    IplImage *T = cvLoadImage("F:\\1.JPG");
    IplImage *SrcImg = cvCreateImage(cvSize(T->width, T->height), IPL_DEPTH_8U, 1);
    cvCvtColor(T, SrcImg, CV_BGR2GRAY);
    //IplImage  *SrcImg = cvLoadImage("F:\\3.jpg");

    cvNamedWindow("处理前", CV_WINDOW_AUTOSIZE);
    cvShowImage("处理前", SrcImg);

    IplImage *DestImg = cvCreateImage(cvSize(SrcImg->width / 2, SrcImg->height / 2), SrcImg->depth, SrcImg->nChannels);

    LARGE_INTEGER t1, t2, tc;
    QueryPerformanceFrequency(&tc);
    QueryPerformanceCounter(&t1);
    
    for(int i=0; i<100; i++)    cvResize(SrcImg, DestImg, CV_INTER_CUBIC);
    
    QueryPerformanceCounter(&t2);
    printf("Use Time:%f\n", (t2.QuadPart - t1.QuadPart) * 1000.0f / tc.QuadPart);

    cvNamedWindow("处理后", CV_WINDOW_AUTOSIZE);
    cvShowImage("处理后", DestImg);

    cvReleaseImage(&SrcImg);
    cvReleaseImage(&DestImg);
    cvReleaseImage(&T);

  我使用了一张3000*2000的大图进行测试,令我非常诧异的是,执行100次这个函数耗时居然只有  Use Time:82.414300 ms,每一帧都不到1ms,目标图像的大小可是1500*1000的呢,立马打开我自己的Demo,同样的环境下测试,100次耗时达到了450ms,相差太多了,要知道,我那个可是SSE优化后的啊。有点不敢相信这个事实。

       接着,我把CV_INTER_LINEAR(双线性)改为CV_INTER_NN(最近临),出来的结果是Use Time:78.921600 ms,注意到没有,时间比双线性的还要多,感觉这完全不合乎逻辑啊。

       稍微冷静下来,我认为这绝对不符合真理,但是我心中已经隐隐约约知道大概为什么会出现这个情况,于是,我又做了下面几个测试。

       第一、换一副图像看看,我把源图像的大小改为3001*2000,测试结果为:Use Time:543.837400 ms。

                  把源图像的大小改为3000*2001,测试结果为:Use Time:541.567800 ms。

                  把源图像的大小改为3001*2001,测试结果为:Use Time:547.325600 ms。

       第二:源图像还是使用3000*2000大小,把DestImg的大小修改为1501*1000,测试结果为:Use Time:552.432800 ms。

               把DestImg的大小修改为1500*1001,测试结果为:Use Time:549.956400 ms。

               把DestImg的大小修改为1501*1001,测试结果为:Use Time:551.371200 ms。

  这两个测试表明,这种情况只在:

          一、源图像的宽度和高度均为2的倍数时;

          二、目标图像的宽度和高度都必须为源图像的一半时;

  时方有可能出现,那么他们是充分条件了吗?接着做试验。

  第三:把插值方法改为其他的方式,比如CV_INTER_CUBIC(三次立方),若其他参数都不变,测试结果为:Use Time:921.885900 ms。

                同样适使用三次立方,源图大小修改为3000*2001,测试结果为:Use Time:953.748100 ms。

      &nb

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值