diff --git a/modules/imgproc/perf/perf_cornerEigenValsAndVecs.cpp b/modules/imgproc/perf/perf_cornerEigenValsAndVecs.cpp deleted file mode 100644 index 5a323cc2ab..0000000000 --- a/modules/imgproc/perf/perf_cornerEigenValsAndVecs.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "perf_precomp.hpp" - -using namespace std; -using namespace cv; -using namespace perf; -using std::tr1::make_tuple; -using std::tr1::get; - -CV_ENUM(BorderType, BORDER_REPLICATE, BORDER_CONSTANT, BORDER_REFLECT, BORDER_REFLECT_101) - -typedef std::tr1::tuple Img_BlockSize_ApertureSize_BorderType_t; -typedef perf::TestBaseWithParam Img_BlockSize_ApertureSize_BorderType; - -PERF_TEST_P(Img_BlockSize_ApertureSize_BorderType, cornerEigenValsAndVecs, - testing::Combine( - testing::Values( "stitching/a1.png", "cv/shared/pic5.png"), - testing::Values( 3, 5 ), - testing::Values( 3, 5 ), - BorderType::all() - ) - ) -{ - string filename = getDataPath(get<0>(GetParam())); - int blockSize = get<1>(GetParam()); - int apertureSize = get<2>(GetParam()); - BorderType borderType = get<3>(GetParam()); - - Mat src = imread(filename, IMREAD_GRAYSCALE); - if (src.empty()) - FAIL() << "Unable to load source image" << filename; - - Mat dst; - - TEST_CYCLE() cornerEigenValsAndVecs(src, dst, blockSize, apertureSize, borderType); - - Mat l1; - extractChannel(dst, l1, 0); - - SANITY_CHECK(l1, 2e-5); -} diff --git a/modules/imgproc/perf/perf_cornerHarris.cpp b/modules/imgproc/perf/perf_cornerHarris.cpp deleted file mode 100644 index 832845e7e7..0000000000 --- a/modules/imgproc/perf/perf_cornerHarris.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "perf_precomp.hpp" - -using namespace std; -using namespace cv; -using namespace perf; -using std::tr1::make_tuple; -using std::tr1::get; - -CV_ENUM(BorderType, BORDER_REPLICATE, BORDER_CONSTANT, BORDER_REFLECT, BORDER_REFLECT_101) - -typedef std::tr1::tuple Img_BlockSize_ApertureSize_k_BorderType_t; -typedef perf::TestBaseWithParam Img_BlockSize_ApertureSize_k_BorderType; - -PERF_TEST_P(Img_BlockSize_ApertureSize_k_BorderType, cornerHarris, - testing::Combine( - testing::Values( "stitching/a1.png", "cv/shared/pic5.png"), - testing::Values( 3, 5 ), - testing::Values( 3, 5 ), - testing::Values( 0.04, 0.1 ), - BorderType::all() - ) - ) -{ - string filename = getDataPath(get<0>(GetParam())); - int blockSize = get<1>(GetParam()); - int apertureSize = get<2>(GetParam()); - double k = get<3>(GetParam()); - BorderType borderType = get<4>(GetParam()); - - Mat src = imread(filename, IMREAD_GRAYSCALE); - if (src.empty()) - FAIL() << "Unable to load source image" << filename; - - Mat dst; - - TEST_CYCLE() cornerHarris(src, dst, blockSize, apertureSize, k, borderType); - - SANITY_CHECK(dst, 2e-5); -} diff --git a/modules/imgproc/perf/perf_corners.cpp b/modules/imgproc/perf/perf_corners.cpp new file mode 100644 index 0000000000..dd1e2cc3a2 --- /dev/null +++ b/modules/imgproc/perf/perf_corners.cpp @@ -0,0 +1,92 @@ +#include "perf_precomp.hpp" + +using namespace std; +using namespace cv; +using namespace perf; +using std::tr1::make_tuple; +using std::tr1::get; + +CV_ENUM(BorderType, BORDER_REPLICATE, BORDER_CONSTANT, BORDER_REFLECT, BORDER_REFLECT_101) + +typedef std::tr1::tuple Img_BlockSize_ApertureSize_k_BorderType_t; +typedef perf::TestBaseWithParam Img_BlockSize_ApertureSize_k_BorderType; + +PERF_TEST_P(Img_BlockSize_ApertureSize_k_BorderType, cornerHarris, + testing::Combine( + testing::Values( "stitching/a1.png", "cv/shared/pic5.png"), + testing::Values( 3, 5 ), + testing::Values( 3, 5 ), + testing::Values( 0.04, 0.1 ), + BorderType::all() + ) + ) +{ + string filename = getDataPath(get<0>(GetParam())); + int blockSize = get<1>(GetParam()); + int apertureSize = get<2>(GetParam()); + double k = get<3>(GetParam()); + BorderType borderType = get<4>(GetParam()); + + Mat src = imread(filename, IMREAD_GRAYSCALE); + ASSERT_FALSE(src.empty()) << "Unable to load source image: " << filename; + + Mat dst; + + TEST_CYCLE() cornerHarris(src, dst, blockSize, apertureSize, k, borderType); + + SANITY_CHECK(dst, 2e-5, ERROR_RELATIVE); +} + +typedef std::tr1::tuple Img_BlockSize_ApertureSize_BorderType_t; +typedef perf::TestBaseWithParam Img_BlockSize_ApertureSize_BorderType; + +PERF_TEST_P(Img_BlockSize_ApertureSize_BorderType, cornerEigenValsAndVecs, + testing::Combine( + testing::Values( "stitching/a1.png", "cv/shared/pic5.png"), + testing::Values( 3, 5 ), + testing::Values( 3, 5 ), + BorderType::all() + ) + ) +{ + string filename = getDataPath(get<0>(GetParam())); + int blockSize = get<1>(GetParam()); + int apertureSize = get<2>(GetParam()); + BorderType borderType = get<3>(GetParam()); + + Mat src = imread(filename, IMREAD_GRAYSCALE); + ASSERT_FALSE(src.empty()) << "Unable to load source image: " << filename; + + Mat dst; + + TEST_CYCLE() cornerEigenValsAndVecs(src, dst, blockSize, apertureSize, borderType); + + Mat l1; + extractChannel(dst, l1, 0); + + SANITY_CHECK(l1, 2e-5, ERROR_RELATIVE); +} + +PERF_TEST_P(Img_BlockSize_ApertureSize_BorderType, cornerMinEigenVal, + testing::Combine( + testing::Values( "stitching/a1.png", "cv/shared/pic5.png"), + testing::Values( 3, 5 ), + testing::Values( 3, 5 ), + BorderType::all() + ) + ) +{ + string filename = getDataPath(get<0>(GetParam())); + int blockSize = get<1>(GetParam()); + int apertureSize = get<2>(GetParam()); + BorderType borderType = get<3>(GetParam()); + + Mat src = imread(filename, IMREAD_GRAYSCALE); + ASSERT_FALSE(src.empty()) << "Unable to load source image: " << filename; + + Mat dst; + + TEST_CYCLE() cornerMinEigenVal(src, dst, blockSize, apertureSize, borderType); + + SANITY_CHECK(dst, 2e-5, ERROR_RELATIVE); +} diff --git a/modules/imgproc/src/corner.cpp b/modules/imgproc/src/corner.cpp index edc3504fb1..52e264710f 100644 --- a/modules/imgproc/src/corner.cpp +++ b/modules/imgproc/src/corner.cpp @@ -460,10 +460,63 @@ void cv::cornerMinEigenVal( InputArray _src, OutputArray _dst, int blockSize, in Mat src = _src.getMat(); _dst.create( src.size(), CV_32FC1 ); Mat dst = _dst.getMat(); + +#if defined(HAVE_IPP) && !defined(HAVE_IPP_ICV_ONLY) && (IPP_VERSION_MAJOR >= 8) + typedef IppStatus (CV_STDCALL * ippiMinEigenValGetBufferSize)(IppiSize, int, int, int*); + typedef IppStatus (CV_STDCALL * ippiMinEigenVal)(const void*, int, Ipp32f*, int, IppiSize, IppiKernelType, int, int, Ipp8u*); + IppiKernelType kerType; + int kerSize = ksize; + if (ksize < 0) + { + kerType = ippKernelScharr; + kerSize = 3; + } else + { + kerType = ippKernelSobel; + } + bool isolated = (borderType & BORDER_ISOLATED) != 0; + int borderTypeNI = borderType & ~BORDER_ISOLATED; + if ((borderTypeNI == BORDER_REPLICATE && (!src.isSubmatrix() || isolated)) && + (kerSize == 3 || kerSize == 5) && (kerSize == 3 || blockSize == 5)) + { + ippiMinEigenValGetBufferSize getBufferSizeFunc = 0; + ippiMinEigenVal minEigenValFunc = 0; + float norm_coef = 0.f; + + if (src.type() == CV_8UC1) + { + getBufferSizeFunc = (ippiMinEigenValGetBufferSize) ippiMinEigenValGetBufferSize_8u32f_C1R; + minEigenValFunc = (ippiMinEigenVal) ippiMinEigenVal_8u32f_C1R; + norm_coef = 1.f / 255.f; + } else if (src.type() == CV_32FC1) + { + getBufferSizeFunc = (ippiMinEigenValGetBufferSize) ippiMinEigenValGetBufferSize_32f_C1R; + minEigenValFunc = (ippiMinEigenVal) ippiMinEigenVal_32f_C1R; + norm_coef = 255.f; + } + + if (getBufferSizeFunc && minEigenValFunc) + { + int bufferSize; + IppiSize srcRoi = { src.cols, src.rows }; + IppStatus ok = getBufferSizeFunc(srcRoi, ksize, blockSize, &bufferSize); + if (ok >= 0) + { + AutoBuffer buffer(bufferSize); + ok = minEigenValFunc(src.data, (int) src.step, (Ipp32f*) dst.data, (int) dst.step, srcRoi, kerType, kerSize, blockSize, buffer); + CV_SUPPRESS_DEPRECATED_START + if (ok >= 0) ok = ippiMulC_32f_C1IR(norm_coef, (Ipp32f*) dst.data, (int) dst.step, srcRoi); + CV_SUPPRESS_DEPRECATED_END + if (ok >= 0) + return; + } + setIppErrorStatus(); + } + } +#endif cornerEigenValsVecs( src, dst, blockSize, ksize, MINEIGENVAL, 0, borderType ); } - void cv::cornerHarris( InputArray _src, OutputArray _dst, int blockSize, int ksize, double k, int borderType ) { CV_OCL_RUN(_src.dims() <= 2 && _dst.isUMat(),