1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <stdio.h>
2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "opencv2/core/utility.hpp"
4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "opencv2/imgproc.hpp"
5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "opencv2/highgui.hpp"
6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "cvconfig.h"
7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace std;
9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace cv;
10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_IPP_A
12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "opencv2/core/ippasync.hpp"
13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CHECK_STATUS(STATUS, NAME)\
15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(STATUS!=HPP_STATUS_NO_ERROR){ printf("%s error %d\n", NAME, STATUS);\
16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (virtMatrix) {hppStatus delSts = hppiDeleteVirtualMatrices(accel, virtMatrix); CHECK_DEL_STATUS(delSts,"hppiDeleteVirtualMatrices");}\
17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (accel)      {hppStatus delSts = hppDeleteInstance(accel); CHECK_DEL_STATUS(delSts, "hppDeleteInstance");}\
18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return -1;}
19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CHECK_DEL_STATUS(STATUS, NAME)\
21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(STATUS!=HPP_STATUS_NO_ERROR){ printf("%s error %d\n", NAME, STATUS); return -1;}
22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void help()
26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler printf("\nThis program shows how to use the conversion for IPP Async.\n"
28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler"This example uses the Sobel filter.\n"
29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler"You can use cv::Sobel or hppiSobel.\n"
30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler"Usage: \n"
31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler"./ipp_async_sobel [--camera]=<use camera,if this key is present>, \n"
32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler"                  [--file_name]=<path to movie or image file>\n"
33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler"                  [--accel]=<accelerator type: auto (default), cpu, gpu>\n\n");
34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerconst char* keys =
37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    "{c  camera   |           | use camera or not}"
39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    "{fn file_name|../data/baboon.jpg | image file       }"
40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    "{a accel     |auto       | accelerator type: auto (default), cpu, gpu}"
41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler};
42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//this is a sample for hppiSobel functions
44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint main(int argc, const char** argv)
45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    help();
47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    VideoCapture cap;
49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CommandLineParser parser(argc, argv, keys);
50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mat image, gray, result;
51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_IPP_A
53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    hppiMatrix* src,* dst;
55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    hppAccel accel = 0;
56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    hppAccelType accelType;
57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    hppStatus sts;
58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    hppiVirtualMatrix * virtMatrix;
59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool useCamera = parser.has("camera");
61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    string file = parser.get<string>("file_name");
62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    string sAccel = parser.get<string>("accel");
63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    parser.printMessage();
65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( useCamera )
67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        printf("used camera\n");
69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cap.open(0);
70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        printf("used image %s\n", file.c_str());
74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cap.open(file.c_str());
75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !cap.isOpened() )
78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        printf("can not open camera or video file\n");
80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return -1;
81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    accelType = sAccel == "cpu" ? HPP_ACCEL_TYPE_CPU:
84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                sAccel == "gpu" ? HPP_ACCEL_TYPE_GPU:
85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                  HPP_ACCEL_TYPE_ANY;
86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //Create accelerator instance
88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    sts = hppCreateInstance(accelType, 0, &accel);
89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CHECK_STATUS(sts, "hppCreateInstance");
90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    accelType = hppQueryAccelType(accel);
92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    sAccel = accelType == HPP_ACCEL_TYPE_CPU ? "cpu":
94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             accelType == HPP_ACCEL_TYPE_GPU ? "gpu":
95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             accelType == HPP_ACCEL_TYPE_GPU_VIA_DX9 ? "gpu dx9": "?";
96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    printf("accelType %s\n", sAccel.c_str());
98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    virtMatrix = hppiCreateVirtualMatrices(accel, 1);
100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for(;;)
102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cap >> image;
104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if(image.empty())
105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cvtColor( image, gray, COLOR_BGR2GRAY );
108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        result.create( image.rows, image.cols, CV_8U);
110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        double execTime = (double)getTickCount();
112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        //convert Mat to hppiMatrix
114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        src = hpp::getHpp(gray,accel);
115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        dst = hpp::getHpp(result,accel);
116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sts = hppiSobel(accel,src, HPP_MASK_SIZE_3X3,HPP_NORM_L1,virtMatrix[0]);
118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CHECK_STATUS(sts,"hppiSobel");
119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sts = hppiConvert(accel, virtMatrix[0], 0, HPP_RND_MODE_NEAR, dst, HPP_DATA_TYPE_8U);
121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CHECK_STATUS(sts,"hppiConvert");
122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // Wait for tasks to complete
124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sts = hppWait(accel, HPP_TIME_OUT_INFINITE);
125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CHECK_STATUS(sts, "hppWait");
126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        execTime = ((double)getTickCount() - execTime)*1000./getTickFrequency();
128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        printf("Time : %0.3fms\n", execTime);
130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        imshow("image", image);
132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        imshow("rez", result);
133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        waitKey(15);
135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sts =  hppiFreeMatrix(src);
137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CHECK_DEL_STATUS(sts,"hppiFreeMatrix");
138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sts =  hppiFreeMatrix(dst);
140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CHECK_DEL_STATUS(sts,"hppiFreeMatrix");
141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!useCamera)
145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        waitKey(0);
146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (virtMatrix)
148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sts = hppiDeleteVirtualMatrices(accel, virtMatrix);
150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CHECK_DEL_STATUS(sts,"hppiDeleteVirtualMatrices");
151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (accel)
154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sts = hppDeleteInstance(accel);
156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CHECK_DEL_STATUS(sts, "hppDeleteInstance");
157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    printf("SUCCESS\n");
160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    printf("IPP Async not supported\n");
164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return 0;
168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
169