14

最近、画像処理にIntel Performance Primitives (IPP)を使い始めました。IPP について聞いたことがない人は、IPPを線形代数ではなく、画像処理のMKLに類似したものと考えてください。

私はすでに OpenCV でやや複雑なビジョン システムを実装しており、OpenCV ルーチンの一部 (畳み込みや FFT など) をより高速な IPP ルーチンに交換したいと考えています。私の OpenCV コードは常にcv::Mat画像データ構造を使用します。ただし、IPP コード サンプルに基づくと、IPP は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::Mataを にCIppiImage、またはその逆に変換するワンライナーはありますか?
  2. 実装の詳細にはかなり精通していcv::Matますが、 についてはあまり知りませんCIppiImage。同じデータレイアウトcv::Matを持っていますか? CIppiImageもしそうなら、私は次のキャストに似た何かをすることができますか? CIppiImage cimg = (CIppiImage)(&myMat.data[0])?
4

1 に答える 1

8

OpenCV データを IPP 関数に渡すクリーンな方法があります。

OpenCV がある場合はMat、にキャストでき*Mat.data[0]ますconst Ipp<type>*。たとえば、8 ビットの unsigned char ( ) データを扱う場合、IPP 関数に8uプラグインできます。典型的なLena画像で関数を(const Ipp8u*)&img.data[0]使用した例を次に示します。ippiFilter

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と、期待される結果が得られます。 ここに画像の説明を入力

nppiFilterこれは、Nvidia バージョンを同じパラメーターで 実行したときに得られた結果と一致します。ここに画像の説明を入力


CIppiImage元の質問で呼ばれる構造について言及しました。CIppiImage配列の単純なラッパーです。

于 2012-11-21T02:05:02.573 に答える