mirror of https://github.com/opencv/opencv.git
Merge pull request #12189 from alalek:ippa_cleanup_3.4
commit
32a02544de
15 changed files with 3 additions and 566 deletions
@ -1,45 +0,0 @@ |
||||
# Main variables: |
||||
# IPP_A_LIBRARIES and IPP_A_INCLUDE to use IPP Async |
||||
# HAVE_IPP_A for conditional compilation OpenCV with/without IPP Async |
||||
|
||||
# IPP_ASYNC_ROOT - root of IPP Async installation |
||||
|
||||
if(X86_64) |
||||
find_path( |
||||
IPP_A_INCLUDE_DIR |
||||
NAMES ipp_async_defs.h |
||||
PATHS $ENV{IPP_ASYNC_ROOT} |
||||
PATH_SUFFIXES include |
||||
DOC "Path to Intel IPP Async interface headers") |
||||
|
||||
find_file( |
||||
IPP_A_LIBRARIES |
||||
NAMES ipp_async_preview.lib |
||||
PATHS $ENV{IPP_ASYNC_ROOT} |
||||
PATH_SUFFIXES lib/intel64 |
||||
DOC "Path to Intel IPP Async interface libraries") |
||||
|
||||
else() |
||||
find_path( |
||||
IPP_A_INCLUDE_DIR |
||||
NAMES ipp_async_defs.h |
||||
PATHS $ENV{IPP_ASYNC_ROOT} |
||||
PATH_SUFFIXES include |
||||
DOC "Path to Intel IPP Async interface headers") |
||||
|
||||
find_file( |
||||
IPP_A_LIBRARIES |
||||
NAMES ipp_async_preview.lib |
||||
PATHS $ENV{IPP_ASYNC_ROOT} |
||||
PATH_SUFFIXES lib/ia32 |
||||
DOC "Path to Intel IPP Async interface libraries") |
||||
endif() |
||||
|
||||
if(IPP_A_INCLUDE_DIR AND IPP_A_LIBRARIES) |
||||
set(HAVE_IPP_A TRUE) |
||||
else() |
||||
set(HAVE_IPP_A FALSE) |
||||
message(WARNING "Intel IPP Async library directory (set by IPP_A_LIBRARIES_DIR variable) is not found or does not have Intel IPP Async libraries.") |
||||
endif() |
||||
|
||||
mark_as_advanced(FORCE IPP_A_LIBRARIES IPP_A_INCLUDE_DIR) |
@ -1,146 +0,0 @@ |
||||
Intel® IPP Asynchronous C/C++ library in OpenCV {#tutorial_how_to_use_ippa_conversion} |
||||
=============================================== |
||||
|
||||
@prev_tutorial{tutorial_interoperability_with_OpenCV_1} |
||||
@next_tutorial{tutorial_how_to_use_OpenCV_parallel_for_} |
||||
|
||||
Goal |
||||
---- |
||||
|
||||
The tutorial demonstrates the [Intel® IPP Asynchronous |
||||
C/C++](http://software.intel.com/en-us/intel-ipp-preview) library usage with OpenCV. The code |
||||
example below illustrates implementation of the Sobel operation, accelerated with Intel® IPP |
||||
Asynchronous C/C++ functions. In this code example, @ref cv::hpp::getMat and @ref cv::hpp::getHpp |
||||
functions are used for data conversion between |
||||
[hppiMatrix](http://software.intel.com/en-us/node/501660) and Mat matrices. |
||||
|
||||
Code |
||||
---- |
||||
|
||||
You may also find the source code in the |
||||
`samples/cpp/tutorial_code/core/ippasync/ippasync_sample.cpp` file of the OpenCV source library or |
||||
download it from [here](https://github.com/opencv/opencv/tree/3.4/samples/cpp/tutorial_code/core/ippasync/ippasync_sample.cpp). |
||||
|
||||
@include cpp/tutorial_code/core/ippasync/ippasync_sample.cpp |
||||
|
||||
Explanation |
||||
----------- |
||||
|
||||
-# Create parameters for OpenCV: |
||||
@code{.cpp} |
||||
VideoCapture cap; |
||||
Mat image, gray, result; |
||||
@endcode |
||||
and IPP Async: |
||||
@code{.cpp} |
||||
hppiMatrix* src,* dst; |
||||
hppAccel accel = 0; |
||||
hppAccelType accelType; |
||||
hppStatus sts; |
||||
hppiVirtualMatrix * virtMatrix; |
||||
@endcode |
||||
-# Load input image or video. How to open and read video stream you can see in the |
||||
@ref tutorial_video_input_psnr_ssim tutorial. |
||||
@code{.cpp} |
||||
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; |
||||
} |
||||
@endcode |
||||
-# Create accelerator instance using |
||||
[hppCreateInstance](http://software.intel.com/en-us/node/501686): |
||||
@code{.cpp} |
||||
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"); |
||||
@endcode |
||||
-# Create an array of virtual matrices using |
||||
[hppiCreateVirtualMatrices](http://software.intel.com/en-us/node/501700) function. |
||||
@code{.cpp} |
||||
virtMatrix = hppiCreateVirtualMatrices(accel, 1); |
||||
@endcode |
||||
-# Prepare a matrix for input and output data: |
||||
@code{.cpp} |
||||
cap >> image; |
||||
if(image.empty()) |
||||
break; |
||||
|
||||
cvtColor( image, gray, COLOR_BGR2GRAY ); |
||||
|
||||
result.create( image.rows, image.cols, CV_8U); |
||||
@endcode |
||||
-# Convert Mat to [hppiMatrix](http://software.intel.com/en-us/node/501660) using @ref cv::hpp::getHpp |
||||
and call [hppiSobel](http://software.intel.com/en-us/node/474701) function. |
||||
@code{.cpp} |
||||
//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"); |
||||
@endcode |
||||
We use [hppiConvert](http://software.intel.com/en-us/node/501746) because |
||||
[hppiSobel](http://software.intel.com/en-us/node/474701) returns destination matrix with |
||||
HPP_DATA_TYPE_16S data type for source matrix with HPP_DATA_TYPE_8U type. You should check |
||||
hppStatus after each call IPP Async function. |
||||
|
||||
-# Create windows and show the images, the usual way. |
||||
@code{.cpp} |
||||
imshow("image", image); |
||||
imshow("rez", result); |
||||
|
||||
waitKey(15); |
||||
@endcode |
||||
-# Delete hpp matrices. |
||||
@code{.cpp} |
||||
sts = hppiFreeMatrix(src); |
||||
CHECK_DEL_STATUS(sts,"hppiFreeMatrix"); |
||||
|
||||
sts = hppiFreeMatrix(dst); |
||||
CHECK_DEL_STATUS(sts,"hppiFreeMatrix"); |
||||
@endcode |
||||
-# Delete virtual matrices and accelerator instance. |
||||
@code{.cpp} |
||||
if (virtMatrix) |
||||
{ |
||||
sts = hppiDeleteVirtualMatrices(accel, virtMatrix); |
||||
CHECK_DEL_STATUS(sts,"hppiDeleteVirtualMatrices"); |
||||
} |
||||
|
||||
if (accel) |
||||
{ |
||||
sts = hppDeleteInstance(accel); |
||||
CHECK_DEL_STATUS(sts, "hppDeleteInstance"); |
||||
} |
||||
@endcode |
||||
|
||||
Result |
||||
------ |
||||
|
||||
After compiling the code above we can execute it giving an image or video path and accelerator type |
||||
as an argument. For this tutorial we use baboon.png image as input. The result is below. |
||||
|
||||
![](images/How_To_Use_IPPA_Result.jpg) |
Before Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 6.8 KiB |
@ -1,171 +0,0 @@ |
||||
// This file is part of OpenCV project.
|
||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||
// of this distribution and at http://opencv.org/license.html.
|
||||
#include "test_precomp.hpp" |
||||
#include "opencv2/ts/ocl_test.hpp" |
||||
|
||||
#ifdef HAVE_IPP_A |
||||
#include "opencv2/core/ippasync.hpp" |
||||
|
||||
using namespace cv; |
||||
using namespace std; |
||||
using namespace opencv_test; |
||||
|
||||
namespace opencv_test { |
||||
namespace ocl { |
||||
|
||||
PARAM_TEST_CASE(IPPAsync, MatDepth, Channels, hppAccelType) |
||||
{ |
||||
int type; |
||||
int cn; |
||||
int depth; |
||||
hppAccelType accelType; |
||||
|
||||
Mat matrix, result; |
||||
hppiMatrix * hppMat; |
||||
hppAccel accel; |
||||
hppiVirtualMatrix * virtMatrix; |
||||
hppStatus sts; |
||||
|
||||
virtual void SetUp() |
||||
{ |
||||
type = CV_MAKE_TYPE(GET_PARAM(0), GET_PARAM(1)); |
||||
depth = GET_PARAM(0); |
||||
cn = GET_PARAM(1); |
||||
accelType = GET_PARAM(2); |
||||
} |
||||
|
||||
void generateTestData() |
||||
{ |
||||
Size matrix_Size = randomSize(2, 100); |
||||
const double upValue = 100; |
||||
|
||||
matrix = randomMat(matrix_Size, type, -upValue, upValue); |
||||
} |
||||
|
||||
void Near(double threshold = 0.0) |
||||
{ |
||||
EXPECT_MAT_NEAR(matrix, result, threshold); |
||||
} |
||||
}; |
||||
|
||||
TEST_P(IPPAsync, accuracy) |
||||
{ |
||||
sts = hppCreateInstance(accelType, 0, &accel); |
||||
if (sts!=HPP_STATUS_NO_ERROR) printf("hppStatus = %d\n",sts); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
|
||||
virtMatrix = hppiCreateVirtualMatrices(accel, 2); |
||||
|
||||
for (int j = 0; j < test_loop_times; j++) |
||||
{ |
||||
generateTestData(); |
||||
hppMat = hpp::getHpp(matrix,accel); |
||||
|
||||
hppScalar a = 3; |
||||
|
||||
sts = hppiAddC(accel, hppMat, a, 0, virtMatrix[0]); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
sts = hppiSubC(accel, virtMatrix[0], a, 0, virtMatrix[1]); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
|
||||
sts = hppWait(accel, HPP_TIME_OUT_INFINITE); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
|
||||
result = hpp::getMat(virtMatrix[1], accel, cn); |
||||
|
||||
Near(5.0e-6); |
||||
|
||||
sts = hppiFreeMatrix(hppMat); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
} |
||||
|
||||
sts = hppiDeleteVirtualMatrices(accel, virtMatrix); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
sts = hppDeleteInstance(accel); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
} |
||||
|
||||
PARAM_TEST_CASE(IPPAsyncShared, Channels, hppAccelType) |
||||
{ |
||||
int cn; |
||||
int type; |
||||
hppAccelType accelType; |
||||
|
||||
Mat matrix, result; |
||||
hppiMatrix* hppMat; |
||||
hppAccel accel; |
||||
hppiVirtualMatrix * virtMatrix; |
||||
hppStatus sts; |
||||
|
||||
virtual void SetUp() |
||||
{ |
||||
cn = GET_PARAM(0); |
||||
accelType = GET_PARAM(1); |
||||
type=CV_MAKE_TYPE(CV_8U, GET_PARAM(0)); |
||||
} |
||||
|
||||
void generateTestData() |
||||
{ |
||||
Size matrix_Size = randomSize(2, 100); |
||||
hpp32u pitch, size; |
||||
const int upValue = 100; |
||||
|
||||
sts = hppQueryMatrixAllocParams(accel, (hpp32u)(matrix_Size.width*cn), (hpp32u)matrix_Size.height, HPP_DATA_TYPE_8U, &pitch, &size); |
||||
|
||||
matrix = randomMat(matrix_Size, type, 0, upValue); |
||||
} |
||||
|
||||
void Near(double threshold = 0.0) |
||||
{ |
||||
EXPECT_MAT_NEAR(matrix, result, threshold); |
||||
} |
||||
}; |
||||
|
||||
TEST_P(IPPAsyncShared, accuracy) |
||||
{ |
||||
sts = hppCreateInstance(accelType, 0, &accel); |
||||
if (sts!=HPP_STATUS_NO_ERROR) printf("hppStatus = %d\n",sts); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
|
||||
virtMatrix = hppiCreateVirtualMatrices(accel, 2); |
||||
|
||||
for (int j = 0; j < test_loop_times; j++) |
||||
{ |
||||
generateTestData(); |
||||
hppMat = hpp::getHpp(matrix,accel); |
||||
|
||||
hppScalar a = 3; |
||||
|
||||
sts = hppiAddC(accel, hppMat, a, 0, virtMatrix[0]); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
sts = hppiSubC(accel, virtMatrix[0], a, 0, virtMatrix[1]); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
|
||||
sts = hppWait(accel, HPP_TIME_OUT_INFINITE); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
|
||||
result = hpp::getMat(virtMatrix[1], accel, cn); |
||||
|
||||
Near(0); |
||||
|
||||
sts = hppiFreeMatrix(hppMat); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
} |
||||
|
||||
sts = hppiDeleteVirtualMatrices(accel, virtMatrix); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
sts = hppDeleteInstance(accel); |
||||
CV_Assert(sts==HPP_STATUS_NO_ERROR); |
||||
} |
||||
|
||||
INSTANTIATE_TEST_CASE_P(IppATest, IPPAsyncShared, Combine(Values(1, 2, 3, 4), |
||||
Values( HPP_ACCEL_TYPE_CPU, HPP_ACCEL_TYPE_GPU))); |
||||
|
||||
INSTANTIATE_TEST_CASE_P(IppATest, IPPAsync, Combine(Values(CV_8U, CV_16U, CV_16S, CV_32F), |
||||
Values(1, 2, 3, 4), |
||||
Values( HPP_ACCEL_TYPE_CPU, HPP_ACCEL_TYPE_GPU))); |
||||
|
||||
} |
||||
} |
||||
#endif |
@ -1,168 +0,0 @@ |
||||
#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; |
||||
} |
Loading…
Reference in new issue