OpenCV中的英特爾?IPP異步C / C ++庫

2018-08-31 10:49 更新

目標(biāo)

本教程演示了使用OpenCV 的英特爾?IPP異步C / C ++庫使用。下面的代碼示例說明了使用英特爾?IPP異步C / C ++功能加速的Sobel操作的實(shí)現(xiàn)。在這個(gè)代碼示例中,cv :: hpp :: getMatcv :: hpp :: getHpp函數(shù)用于hppiMatrix和Mat矩陣之間的數(shù)據(jù)轉(zhuǎn)換。

Code

您還可以在samples/cpp/tutorial_code/core/ippasync/ippasync_sample.cppOpenCV源文件的文件中找到源代碼,或從這里下載。

#include <stdio.h>
#include "opencv2/core/utility.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "cvconfig.h"
using namespace std;
using namespace cv;
#ifdef HAVE_IPP_A
#include "opencv2/core/ippasync.hpp"
#define CHECK_STATUS(STATUS, NAME)\
    if(STATUS!=HPP_STATUS_NO_ERROR){ printf("%s error %d\n", NAME, STATUS);\
    if (virtMatrix) {hppStatus delSts = hppiDeleteVirtualMatrices(accel, virtMatrix); CHECK_DEL_STATUS(delSts,"hppiDeleteVirtualMatrices");}\
    if (accel)      {hppStatus delSts = hppDeleteInstance(accel); CHECK_DEL_STATUS(delSts, "hppDeleteInstance");}\
    return -1;}
#define CHECK_DEL_STATUS(STATUS, NAME)\
    if(STATUS!=HPP_STATUS_NO_ERROR){ printf("%s error %d\n", NAME, STATUS); return -1;}
#endif
static void help()
{
 printf("\nThis program shows how to use the conversion for IPP Async.\n"
"This example uses the Sobel filter.\n"
"You can use cv::Sobel or hppiSobel.\n"
"Usage: \n"
"./ipp_async_sobel [--camera]=<use camera,if this key is present>, \n"
"                  [--file_name]=<path to movie or image file>\n"
"                  [--accel]=<accelerator type: auto (default), cpu, gpu>\n\n");
}
const char* keys =
{
    "{c  camera   |           | use camera or not}"
    "{fn file_name|../data/baboon.jpg | image file       }"
    "{a accel     |auto       | accelerator type: auto (default), cpu, gpu}"
};
//this is a sample for hppiSobel functions
int main(int argc, const char** argv)
{
    help();
    VideoCapture cap;
    CommandLineParser parser(argc, argv, keys);
    Mat image, gray, result;
#ifdef HAVE_IPP_A
    hppiMatrix* src,* dst;
    hppAccel accel = 0;
    hppAccelType accelType;
    hppStatus sts;
    hppiVirtualMatrix * virtMatrix;
    bool useCamera = parser.has("camera");
    string file = parser.get<string>("file_name");
    string sAccel = parser.get<string>("accel");
    parser.printMessage();
    if( useCamera )
    {
        printf("used camera\n");
        cap.open(0);
    }
    else
    {
        printf("used image %s\n", file.c_str());
        cap.open(file.c_str());
    }
    if( !cap.isOpened() )
    {
        printf("can not open camera or video file\n");
        return -1;
    }
    accelType = sAccel == "cpu" ? HPP_ACCEL_TYPE_CPU:
                sAccel == "gpu" ? HPP_ACCEL_TYPE_GPU:
                                  HPP_ACCEL_TYPE_ANY;
    //Create accelerator instance
    sts = hppCreateInstance(accelType, 0, &accel);
    CHECK_STATUS(sts, "hppCreateInstance");
    accelType = hppQueryAccelType(accel);
    sAccel = accelType == HPP_ACCEL_TYPE_CPU ? "cpu":
             accelType == HPP_ACCEL_TYPE_GPU ? "gpu":
             accelType == HPP_ACCEL_TYPE_GPU_VIA_DX9 ? "gpu dx9": "?";
    printf("accelType %s\n", sAccel.c_str());
    virtMatrix = hppiCreateVirtualMatrices(accel, 1);
    for(;;)
    {
        cap >> image;
        if(image.empty())
            break;
        cvtColor( image, gray, COLOR_BGR2GRAY );
        result.create( image.rows, image.cols, CV_8U);
        double execTime = (double)getTickCount();
        //convert Mat to hppiMatrix
        src = hpp::getHpp(gray,accel);
        dst = hpp::getHpp(result,accel);
        sts = hppiSobel(accel,src, HPP_MASK_SIZE_3X3,HPP_NORM_L1,virtMatrix[0]);
        CHECK_STATUS(sts,"hppiSobel");
        sts = hppiConvert(accel, virtMatrix[0], 0, HPP_RND_MODE_NEAR, dst, HPP_DATA_TYPE_8U);
        CHECK_STATUS(sts,"hppiConvert");
        // Wait for tasks to complete
        sts = hppWait(accel, HPP_TIME_OUT_INFINITE);
        CHECK_STATUS(sts, "hppWait");
        execTime = ((double)getTickCount() - execTime)*1000./getTickFrequency();
        printf("Time : %0.3fms\n", execTime);
        imshow("image", image);
        imshow("rez", result);
        waitKey(15);
        sts =  hppiFreeMatrix(src);
        CHECK_DEL_STATUS(sts,"hppiFreeMatrix");
        sts =  hppiFreeMatrix(dst);
        CHECK_DEL_STATUS(sts,"hppiFreeMatrix");
    }
    if (!useCamera)
        waitKey(0);
    if (virtMatrix)
    {
        sts = hppiDeleteVirtualMatrices(accel, virtMatrix);
        CHECK_DEL_STATUS(sts,"hppiDeleteVirtualMatrices");
    }
    if (accel)
    {
        sts = hppDeleteInstance(accel);
        CHECK_DEL_STATUS(sts, "hppDeleteInstance");
    }
    printf("SUCCESS\n");
#else
    printf("IPP Async not supported\n");
#endif
    return 0;
}

說明

  • 為OpenCV創(chuàng)建參數(shù):
VideoCapture cap;
Mat image, gray, result;

和IPP異步:

hppiMatrix* src,* dst;
hppAccel accel = 0;
hppAccelType accelType;
hppStatus sts;
hppiVirtualMatrix * virtMatrix;
if( useCamera )
{
   printf("used camera\n");
   cap.open(0);
}
else
{
   printf("used image %s\n", file.c_str());
   cap.open(file.c_str());
}
if( !cap.isOpened() )
{
   printf("can not open camera or video file\n");
   return -1;
}

accelType = sAccel == "cpu" ? HPP_ACCEL_TYPE_CPU:
            sAccel == "gpu" ? HPP_ACCEL_TYPE_GPU:
                              HPP_ACCEL_TYPE_ANY;
//Create accelerator instance
sts = hppCreateInstance(accelType, 0, &accel);
CHECK_STATUS(sts, "hppCreateInstance");

virtMatrix = hppiCreateVirtualMatrices(accel,1);

  • 為輸入和輸出數(shù)據(jù)準(zhǔn)備一個(gè)矩陣:

cap >> image;
if(image.empty())
   break;
cvtColor( image, gray, COLOR_BGR2GRAY );
result.create( image.rows, image.cols, CV_8U);

//convert Mat to hppiMatrix
src = getHpp(gray, accel);
dst = getHpp(result, accel);
sts = hppiSobel(accel,src, HPP_MASK_SIZE_3X3,HPP_NORM_L1,virtMatrix[0]);
CHECK_STATUS(sts,"hppiSobel");
sts = hppiConvert(accel, virtMatrix[0], 0, HPP_RND_MODE_NEAR, dst, HPP_DATA_TYPE_8U);
CHECK_STATUS(sts,"hppiConvert");
// Wait for tasks to complete
sts = hppWait(accel, HPP_TIME_OUT_INFINITE);
CHECK_STATUS(sts, "hppWait");

我們使用hppiConvert,因?yàn)?a rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" target="_blank">hppiSobel返回具有HPP_DATA_TYPE_8U類型的源矩陣的HPP_DATA_TYPE_16S數(shù)據(jù)類型的目標(biāo)矩陣。每次調(diào)用IPP異步函數(shù)后,應(yīng)該檢查hppStatus。

  • 創(chuàng)建窗口并顯示圖像,通常的方式。

imshow("image", image);
imshow("rez", result);
waitKey(15);

  • 刪除hpp矩陣。

sts = hppiFreeMatrix(src);
CHECK_DEL_STATUS(sts,“hppiFreeMatrix”);
sts = hppiFreeMatrix(dst);
CHECK_DEL_STATUS(sts,“hppiFreeMatrix”);

  • 刪除虛擬矩陣和加速器實(shí)例。

if (virtMatrix)
{
   sts = hppiDeleteVirtualMatrices(accel, virtMatrix);
   CHECK_DEL_STATUS(sts,"hppiDeleteVirtualMatrices");
}
if (accel)
{
   sts = hppDeleteInstance(accel);
   CHECK_DEL_STATUS(sts, "hppDeleteInstance");
}

結(jié)果

在編譯上面的代碼之后,我們可以執(zhí)行它,給出圖像或視頻路徑和加速器類型作為參數(shù)。對于本教程,我們使用baboon.png圖像作為輸入。結(jié)果如下。

OpenCV中的英特爾?IPP異步C / C ++庫

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號