图像处理的过程中经常会使用到Intel的ipp库(Integrated Performance Primitives),IPP库包含了许多底层优化的函数。如果已经安装了IPP库,opencv在运行时也会自动调用。
近年来,随着计算机视觉的快速发展,使用GPU进行图像处理越来越流行和展现出优势。NVIDIA公司针对GPU开发了的GPU加速的图像、视频、信号处理库NPP(NVIDIA Performance Primitives)。
从取名就可以看出两者之间有着双胞胎一般的相似。事实上,NPP和IPP库函数基本上是一一对应,不同的是一个在CPU上计算一个在GPU上计算。
高度优化的NPP计算单元,执行速度比仅使用CPU要快80倍。
ipp 均值滤波
使用IPP 之前需要安装IPP或者拥有相应的库环境
#include <opencv2/opencv.hpp>
#include "ipp.h"
#include <memory>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "npp.h"
#define check_sts(st) if((st) != ippStsNoErr) throw std::exception("run error") /* Go to Exit if IPP function returned status different from ippStsNoErr */
int filterBoxBorder_ipp(cv::Mat src, cv::Mat dst)
{
IppStatus status = ippStsNoErr;
Ipp8u* pSrc = NULL, *pDst = NULL; /* Pointers to source/destination images */
int srcStep = 0, dstStep = 0; /* Steps, in bytes, through the source/destination images */
IppiSize roiSize; /* Size of source/destination ROI in pixels */
Ipp8u *pBuffer = NULL; /* Pointer to the work buffer */
std::vector<Ipp8u> buffer;
int iTmpBufSize = 0; /* Common work buffer size */
IppiBorderType borderType = ippBorderRepl;
Ipp8u borderValue = 254;
IppiSize maskSize = { 3,3 };
int numChannels = 1;
//pSrc = ippiMalloc_8u_C1(roiSize.width, roiSize.height, &srcStep);
//pDst = ippiMalloc_8u_C1(roiSize.width, roiSize.height, &dstStep);
pSrc = src.data;
pDst = dst.data;
srcStep = src.step;
dstStep = dst.step;
roiSize = { src.size().width, src.size().height };
check_sts(status = ippiFilterBoxBorderGetBufferSize(roiSize, maskSize, ipp8u, numChannels, &iTmpBufSize));
buffer.resize(iTmpBufSize);
//pBuffer = ippsMalloc_8u(iTmpBufSize);
check_sts(status = ippiFilterBoxBorder_8u_C1R(pSrc, srcStep, pDst, dstStep, roiSize, maskSize, borderType, &borderValue, buffer.data()));
//EXIT_MAIN
//ippsFree(pBuffer);
//ip