1#include <stdio.h> 2 3#include "opencv2/core/utility.hpp" 4#include "opencv2/imgproc.hpp" 5#include "opencv2/highgui.hpp" 6#include "cvconfig.h" 7 8using namespace std; 9using namespace cv; 10 11#ifdef HAVE_IPP_A 12#include "opencv2/core/ippasync.hpp" 13 14#define CHECK_STATUS(STATUS, NAME)\ 15 if(STATUS!=HPP_STATUS_NO_ERROR){ printf("%s error %d\n", NAME, STATUS);\ 16 if (virtMatrix) {hppStatus delSts = hppiDeleteVirtualMatrices(accel, virtMatrix); CHECK_DEL_STATUS(delSts,"hppiDeleteVirtualMatrices");}\ 17 if (accel) {hppStatus delSts = hppDeleteInstance(accel); CHECK_DEL_STATUS(delSts, "hppDeleteInstance");}\ 18 return -1;} 19 20#define CHECK_DEL_STATUS(STATUS, NAME)\ 21 if(STATUS!=HPP_STATUS_NO_ERROR){ printf("%s error %d\n", NAME, STATUS); return -1;} 22 23#endif 24 25static void help() 26{ 27 printf("\nThis program shows how to use the conversion for IPP Async.\n" 28"This example uses the Sobel filter.\n" 29"You can use cv::Sobel or hppiSobel.\n" 30"Usage: \n" 31"./ipp_async_sobel [--camera]=<use camera,if this key is present>, \n" 32" [--file_name]=<path to movie or image file>\n" 33" [--accel]=<accelerator type: auto (default), cpu, gpu>\n\n"); 34} 35 36const char* keys = 37{ 38 "{c camera | | use camera or not}" 39 "{fn file_name|../data/baboon.jpg | image file }" 40 "{a accel |auto | accelerator type: auto (default), cpu, gpu}" 41}; 42 43//this is a sample for hppiSobel functions 44int main(int argc, const char** argv) 45{ 46 help(); 47 48 VideoCapture cap; 49 CommandLineParser parser(argc, argv, keys); 50 Mat image, gray, result; 51 52#ifdef HAVE_IPP_A 53 54 hppiMatrix* src,* dst; 55 hppAccel accel = 0; 56 hppAccelType accelType; 57 hppStatus sts; 58 hppiVirtualMatrix * virtMatrix; 59 60 bool useCamera = parser.has("camera"); 61 string file = parser.get<string>("file_name"); 62 string sAccel = parser.get<string>("accel"); 63 64 parser.printMessage(); 65 66 if( useCamera ) 67 { 68 printf("used camera\n"); 69 cap.open(0); 70 } 71 else 72 { 73 printf("used image %s\n", file.c_str()); 74 cap.open(file.c_str()); 75 } 76 77 if( !cap.isOpened() ) 78 { 79 printf("can not open camera or video file\n"); 80 return -1; 81 } 82 83 accelType = sAccel == "cpu" ? HPP_ACCEL_TYPE_CPU: 84 sAccel == "gpu" ? HPP_ACCEL_TYPE_GPU: 85 HPP_ACCEL_TYPE_ANY; 86 87 //Create accelerator instance 88 sts = hppCreateInstance(accelType, 0, &accel); 89 CHECK_STATUS(sts, "hppCreateInstance"); 90 91 accelType = hppQueryAccelType(accel); 92 93 sAccel = accelType == HPP_ACCEL_TYPE_CPU ? "cpu": 94 accelType == HPP_ACCEL_TYPE_GPU ? "gpu": 95 accelType == HPP_ACCEL_TYPE_GPU_VIA_DX9 ? "gpu dx9": "?"; 96 97 printf("accelType %s\n", sAccel.c_str()); 98 99 virtMatrix = hppiCreateVirtualMatrices(accel, 1); 100 101 for(;;) 102 { 103 cap >> image; 104 if(image.empty()) 105 break; 106 107 cvtColor( image, gray, COLOR_BGR2GRAY ); 108 109 result.create( image.rows, image.cols, CV_8U); 110 111 double execTime = (double)getTickCount(); 112 113 //convert Mat to hppiMatrix 114 src = hpp::getHpp(gray,accel); 115 dst = hpp::getHpp(result,accel); 116 117 sts = hppiSobel(accel,src, HPP_MASK_SIZE_3X3,HPP_NORM_L1,virtMatrix[0]); 118 CHECK_STATUS(sts,"hppiSobel"); 119 120 sts = hppiConvert(accel, virtMatrix[0], 0, HPP_RND_MODE_NEAR, dst, HPP_DATA_TYPE_8U); 121 CHECK_STATUS(sts,"hppiConvert"); 122 123 // Wait for tasks to complete 124 sts = hppWait(accel, HPP_TIME_OUT_INFINITE); 125 CHECK_STATUS(sts, "hppWait"); 126 127 execTime = ((double)getTickCount() - execTime)*1000./getTickFrequency(); 128 129 printf("Time : %0.3fms\n", execTime); 130 131 imshow("image", image); 132 imshow("rez", result); 133 134 waitKey(15); 135 136 sts = hppiFreeMatrix(src); 137 CHECK_DEL_STATUS(sts,"hppiFreeMatrix"); 138 139 sts = hppiFreeMatrix(dst); 140 CHECK_DEL_STATUS(sts,"hppiFreeMatrix"); 141 142 } 143 144 if (!useCamera) 145 waitKey(0); 146 147 if (virtMatrix) 148 { 149 sts = hppiDeleteVirtualMatrices(accel, virtMatrix); 150 CHECK_DEL_STATUS(sts,"hppiDeleteVirtualMatrices"); 151 } 152 153 if (accel) 154 { 155 sts = hppDeleteInstance(accel); 156 CHECK_DEL_STATUS(sts, "hppDeleteInstance"); 157 } 158 159 printf("SUCCESS\n"); 160 161#else 162 163 printf("IPP Async not supported\n"); 164 165#endif 166 167 return 0; 168} 169