Intel IPP 和Opencv图像处理

简单介绍一下,IPP是一个intel提供高性能计算的平台,尤其针对intel芯片有特殊的优化。不仅包括图像处理,还有很多其他应用场景。
IPP官方链接
官网教程实在是详细,不愧是intel。

如果只使用IPP选择Download the Stand-Alone Version即可。One API包括IPP是一个大工具包,暂时不需要这么多工具。

在这里插入图片描述
下载就完了

配置环境就不提了,无非就是头文件静态库动态库。

首先看下Started Guides。

在这里插入图片描述

guides里面的示例代码可以跑下试试,功能是打印CPU信息。

在这里插入图片描述

reference是个API手册,这个很重要。

下面有一个图像平滑和旋转的教程,很推荐。看了就能知道IPP写法的套路了。

在这里插入图片描述
他给的平滑和旋转代码链接好像失效了,要的话评论区联系我。

IPP高斯滤波demo
API手册里面有些给了demo。
文档里面的API是不带前缀和后缀的,前缀就是ippi,后缀是_32f_C1R,表示类型和通道数。去对应头文件看看支持哪些通道数。
ippiFilterGaussianBorder_32f_C1R

下面我给一个图像腐蚀的IPP代码。

            cv::Mat inputImage = cv::imread(".jpg", cv::IMREAD_GRAYSCALE);

            cv::Mat outputImage = cv::Mat(inputImage.size(), inputImage.type());
            IppiSize imageSize = { inputImage.cols, inputImage.rows };
            IppiSize maskSize = { 43, 43 };
            Ipp8u* maskdata = new Ipp8u[maskSize.height * maskSize.width];
            for (int i = 0; i < maskSize.height * maskSize.width; i++) {
                maskdata[i] = 1;
            }
            int specSize;
            int bufferSize;
            clock_t start1, finish;
            double total_time;
            start1 = clock();
            // 获取规范结构和缓冲区大小
            ippiMorphologyBorderGetSize_8u_C1R(imageSize, maskSize, &specSize,&bufferSize);

            // 分配规范结构和工作缓冲区内存
            IppiMorphState* pSpec = (IppiMorphState*)ippMalloc(specSize);
            Ipp8u* pBuffer = ippsMalloc_8u(bufferSize);

            // 初始化规范结构
            ippiMorphologyBorderInit_8u_C1R(imageSize, mask.data, maskSize, pSpec, pBuffer);
            start1 = clock();
            // 执行腐蚀操作
            ippiErodeBorder_8u_C1R(inputImage.data, inputImage.step, outputImage.data, outputImage.step, imageSize, ippBorderRepl, 0, pSpec, pBuffer);

            finish = clock();
            total_time = (double)(finish - start1) / CLOCKS_PER_SEC;
            printf("\nTotal time: %f m seconds. ippiErodeBorder_8u_C1R\n", total_time * 1000);
            // 释放内存
            ippFree(pSpec);
            ippsFree(pBuffer);

            //cv::imshow("aa", outputImage);
            //cv::waitKey(0);

还有一个L版本,L是低级版本,效率感觉没差。

          cv::Mat inputImage = cv::imread("", cv::IMREAD_GRAYSCALE);
          cv::Mat outputImage = cv::Mat(inputImage.size(), inputImage.type());
          
          IppiSizeL imageSize = { inputImage.cols, inputImage.rows };
          IppiSizeL maskSize = { 43, 43 };
	      clock_t start, finish;
	      double total_time;
	      start = clock();
          IppSizeL SpecSize;
          ippiErodeGetSpecSize_L(imageSize, maskSize, &SpecSize);

          IppiMorphStateL* pState = (IppiMorphStateL*)ippMalloc(SpecSize);
          IppStatus status = ippiErodeInit_L(imageSize, mask.data, maskSize,  pState);
          if (status != ippStsNoErr) {
              std::cerr << "腐蚀初始化失败" << std::endl;
              return -1;
          }

          IppSizeL bufferSize = 0;
          status = ippiErodeGetBufferSize_L(imageSize, maskSize, IppDataType::ipp8u, inputImage.channels(), &bufferSize);
          if (status != ippStsNoErr) {
              std::cerr << "计算缓冲区大小失败" << std::endl;
              ippiFree(pState);
              return -1;
          }

          // 分配工作缓冲区
          Ipp8u* pBuffer = ippsMalloc_8u(bufferSize);;
          start = clock();
          status = ippiErode_8u_C1R_L(inputImage.data, inputImage.step, outputImage.data, outputImage.step, imageSize, ippBorderRepl, NULL, pState, pBuffer);
       finish = clock();
       total_time = (double)(finish - start) / CLOCKS_PER_SEC;
       printf("\nTotal time: %f m seconds.ippcv_l\n", total_time * 1000);   
          if (status != ippStsNoErr) {
              std::cerr << "腐蚀操作失败" << std::endl;
              ippiFree(pState);
              ippFree(pBuffer);
              return -1;
          }

          ippFree(pState);
          ippFree(pBuffer);

          //cv::imshow("aa", outputImage);
          //cv::waitKey(0);
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IPP(Integrated Performance Primitives)是Intel开发的一套高性能数学和信号处理函数库,可以用于加速图像处理算法。OpenCV库中包含了IPP模块,可以使用IPP库来加速一些OpenCV函数的处理速度。下面是使用IPP模块加速OpenCV函数的一般步骤: 1. 引入IPP库:在代码中引入IPP库头文件,例如: ```c++ #include "ipp.h" ``` 2. 初始化IPP库:在代码中初始化IPP库,例如: ```c++ IppStatus status = ippInit(); if (status != ippStsNoErr) { // 初始化IPP库失败 } ``` 3. 加速OpenCV函数:在代码中使用IPP库函数加速OpenCV函数,例如: ```c++ cv::Mat src, dst; // 加载图像到src中 IppiSize size = { src.cols, src.rows }; IppiWarpAffineParams params = { ... }; // 设置warpAffine参数 IppStatus status = ippiWarpAffine_8u_C3R(src.data, src.step, dst.data, dst.step, size, params, ippBorderRepl); if (status != ippStsNoErr) { // warpAffine处理失败 } // 处理dst图像 ``` 在这个示例中,ippiWarpAffine_8u_C3R函数是IPP库中的一个图像变换函数,可以替代OpenCV库中的warpAffine函数。通过使用IPP库的函数,可以加速图像变换的处理速度。 需要注意的是,并不是所有的OpenCV函数都可以使用IPP模块加速。一些OpenCV函数已经使用了其他优化模块进行了优化,或者不适合使用IPP模块加速。在使用IPP模块加速OpenCV函数之前,需要仔细考虑是否适合使用IPP模块,并进行性能测试以验证加速效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值