Как IPP может улучшить приложение OpenCV? И как мне его интегрировать?

Я размышлял:

  1. Как Intel IPP может ускорить работу приложений OpenCV?
  2. Как я могу интегрировать его в уже написанные в уже написанных приложениях OpenCV?

Я не нашел немедленного ответа (этот документ на самом деле мало что говорит), но, наконец, я нашел этот вопрос, ответ на который имеет четкий пример ответа на вопрос 1. и частично на 2.

Однако у меня есть наблюдение:

  1. Можно ли считать кастинг (const Ipp8u*)&img.data[0] неэффективным?
  2. Я хочу улучшить дескриптор SURF, используя параллельные вычисления и векторизацию. Может ли IPP помочь мне?
  3. Как я могу разработать свой OpenCV в обоих случаях, если IPP присутствует на целевой машине или нет?

person justHelloWorld    schedule 03.02.2017    source источник
comment
Проверьте, например, здесь... в практика, это куча #ifdef, чтобы проверить, включен ли IPP или нет   -  person Miki    schedule 03.02.2017
comment
@Miki хорошо, это имеет смысл, спасибо. Не могли бы вы пожалуйста взглянуть на этот вопрос? Я понятия не имею, как я могу изменить OpenCV CMake, чтобы он работал с инструментами параллельной студии Intel.   -  person justHelloWorld    schedule 03.02.2017
comment
Уже видел это... без понятия ;)   -  person Miki    schedule 03.02.2017


Ответы (1)


Я могу поделиться с вами примером использования функций Open CV и IPP в одном консольном приложении. Как видите, Open CV Mat можно использовать в функциях IPP, которые обычно работают быстрее, чем функции IPP.

#include <Windows.h>
#include <Vfw.h>
#include <string>
#include <iostream>


#include "opencv2\core\core.hpp"
#include "opencv2\imgproc\imgproc.hpp"
#include "opencv2\imgcodecs\imgcodecs.hpp"
#include "opencv2\highgui\highgui.hpp"

#include <ipp.h>
#include <ipps.h>
#include <ippi.h>



using namespace std;
using namespace cv;


int _tmain(int argc, _TCHAR* argv[])
{
    Mat img=imread("d:\\MyFolder\\sample_02.jpg");
    Mat grayImg=img.clone();
    cvtColor(img,grayImg,CV_BGR2GRAY);
    Mat outImg = grayImg.clone();
    int step = img.cols;
    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*)&grayImg.data[0], step,(Ipp8u*)&outImg.data[0], step, dstRoiSize,kernel, kernelSize, anchor,divisor);
    namedWindow("Source image",CV_WINDOW_FREERATIO);
    imshow("Source image", img);
    namedWindow("Output image",CV_WINDOW_FREERATIO);
    imshow("Output image", outImg);
    waitKey();
    return 0;
}
person VideoProcessingResearcher    schedule 19.04.2018