使用Intel IPP使用OpenCV垫图像?[英] Using OpenCV Mat images with Intel IPP?

本文是小编为大家收集整理的关于使用Intel IPP使用OpenCV垫图像?的处理方法,想解了使用Intel IPP使用OpenCV垫图像?的问题怎么解决?使用Intel IPP使用OpenCV垫图像?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我最近开始使用 Intel Performance Primitives(ipp)图像加工.对于那些尚未听说IPP的人,将IPP视为 mkl 用于图像处理而不是线性代数.

我已经在OPENCV中实现了一个复杂的视觉系统,我想将一些OPENCV例程(例如卷积和FFT)交换以获取更快的IPP例程.我的OpenCV代码始终使用cv::Mat图像数据结构.但是,基于IPP代码样本,IPP似乎优先于 CIppiImage CIppiImage 数据结构.

我的系统在OPENCV中进行了几个图像转换,然后我想在IPP中做几件事,然后在OpenCV中做更多的工作.这是使OpenCV和IPP一起效果很好的幼稚方法:

 cv::Mat = load original image
 use OpenCV to do some work on cv::Mat
 write cv::Mat to file

 CIppiImage = read cv::Mat from file //for IPP
 use IPP to do some work on CIppiImage
 write CIppiImage to file

 cv::Mat = read CIppiImage from file
 use OpenCV to do more work on cv::Mat
 write final image to file

但是,这很乏味,阅读/写作文件可能会增加整体执行时间.


我试图使其在图像处理程序中的OpenCV和IPP之间更加无缝.这是可以解决问题的几件事:

  1. 是否有一个单线将cv::Mat转换为CIppiImage,反之亦然?
  2. 我非常熟悉cv::Mat实现细节,但我对CIppiImage的了解不多. cv::Mat和CIppiImage是否具有相同的数据布局?如果是这样,我可以做类似于以下演员的事情吗? CIppiImage cimg = (CIppiImage)(&myMat.data[0])?

推荐答案

有一种干净的方法将OpenCV数据传递到IPP函数.

如果我们有一个opencv Mat,我们可以将const Ipp<type>*施放到const Ipp<type>*.例如,如果我们要处理8位未签名的char(8u)数据,则可以将(const Ipp8u*)&img.data[0]插入IPP函数中.这是一个示例,使用ippiFilter函数与典型 lena 图像:

Mat img = imread("./Lena.pgm"); //OpenCV 8U_C1 image
Mat outImg = img.clone(); //allocate space for convolution results

int step = img.cols; //pitch
const Ipp32s kernel[9] = {-1, 0, 1, -1, 0, 1, -1, 0, 1};
IppiSize kernelSize = {3,3};
IppiSize dstRoiSize = {img.cols - kernelSize.width + 1, img.rows - kernelSize.height + 1};
IppiPoint anchor = {2,2};
int divisor = 1;

IppStatus status = ippiFilter_8u_C1R((const Ipp8u*)&img.data[0], step,
                                     (Ipp8u*)&outImg.data[0], step, dstRoiSize,
                                     kernel, kernelSize, anchor, divisor);

当我编写outImg(从上面的代码)到文件时,它给出了预期的结果: 在此处输入图像说明

这与我运行NVIDIA版本时获得的结果匹配nppiFilter,具有相同的参数: 在此处输入图像说明


我在原始问题中提到了一个称为CIppiImage的结构. CIppiImage只是一个简单的包装器.

本文地址:https://www.itbaoku.cn/post/358986.html