From 4a7289b22f9ead1d9b7f3a190938407d3f74cab1 Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Thu, 6 Mar 2014 15:48:57 +0400 Subject: [PATCH] improved cv::preCornerDetect --- modules/imgproc/src/corner.cpp | 42 ++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/modules/imgproc/src/corner.cpp b/modules/imgproc/src/corner.cpp index 1a58391f8d..cc35ff2de5 100644 --- a/modules/imgproc/src/corner.cpp +++ b/modules/imgproc/src/corner.cpp @@ -41,7 +41,6 @@ //M*/ #include "precomp.hpp" -#define CV_OPENCL_RUN_ASSERT #include "opencl_kernels.hpp" namespace cv @@ -306,16 +305,8 @@ cornerEigenValsVecs( const Mat& src, Mat& eigenv, int block_size, #ifdef HAVE_OPENCL static bool extractCovData(InputArray _src, UMat & Dx, UMat & Dy, int depth, - int block_size, int aperture_size, int borderType, - const char * const borderTypeStr) + float scale, int aperture_size, int borderType) { - float scale = (float)(1 << ((aperture_size > 0 ? aperture_size : 3) - 1)) * block_size; - if (aperture_size < 0) - scale *= 2.0f; - if (depth == CV_8U) - scale *= 255.0f; - scale = 1.0f / scale; - UMat src = _src.getUMat(); Size wholeSize; @@ -333,15 +324,18 @@ static bool extractCovData(InputArray _src, UMat & Dx, UMat & Dy, int depth, Dy.create(src.size(), CV_32FC1); size_t localsize[2] = { sobel_lsz, sobel_lsz }; - size_t globalsize[2] = { localsize[0]*(1 + (src.cols - 1) / localsize[0]), - localsize[1]*(1 + (src.rows - 1) / localsize[1]) }; + size_t globalsize[2] = { localsize[0] * (1 + (src.cols - 1) / localsize[0]), + localsize[1] * (1 + (src.rows - 1) / localsize[1]) }; - int src_offset_x = (src.offset % src.step) / src.elemSize(); - int src_offset_y = src.offset / src.step; + int src_offset_x = (int)((src.offset % src.step) / src.elemSize()); + int src_offset_y = (int)(src.offset / src.step); + + const char * const borderTypes[] = { "BORDER_CONSTANT", "BORDER_REPLICATE", "BORDER_REFLECT", + "BORDER_WRAP", "BORDER_REFLECT101" }; ocl::Kernel k(format("sobel%d", aperture_size).c_str(), ocl::imgproc::covardata_oclsrc, cv::format("-D BLK_X=%d -D BLK_Y=%d -D %s -D SRCTYPE=%s%s", - (int)localsize[0], (int)localsize[1], borderTypeStr, ocl::typeToStr(depth), + (int)localsize[0], (int)localsize[1], borderTypes[borderType], ocl::typeToStr(depth), aperture_size < 0 ? " -D SCHARR" : "")); if (k.empty()) return false; @@ -350,7 +344,7 @@ static bool extractCovData(InputArray _src, UMat & Dx, UMat & Dy, int depth, ocl::KernelArg::WriteOnlyNoSize(Dx), ocl::KernelArg::WriteOnly(Dy), wholeSize.height, wholeSize.width, scale); - return k.run(2, globalsize, localsize, NULL); + return k.run(2, globalsize, localsize, false); } else { @@ -386,9 +380,16 @@ static bool ocl_cornerMinEigenValVecs(InputArray _src, OutputArray _dst, int blo "BORDER_WRAP", "BORDER_REFLECT101" }; const char * const cornerType[] = { "CORNER_MINEIGENVAL", "CORNER_HARRIS", 0 }; + + float scale = (float)(1 << ((aperture_size > 0 ? aperture_size : 3) - 1)) * block_size; + if (aperture_size < 0) + scale *= 2.0f; + if (depth == CV_8U) + scale *= 255.0f; + scale = 1.0f / scale; + UMat Dx, Dy; - if (!extractCovData(_src, Dx, Dy, depth, block_size, aperture_size, - borderType, borderTypes[borderType])) + if (!extractCovData(_src, Dx, Dy, depth, scale, aperture_size, borderType)) return false; ocl::Kernel cornelKernel("corner", ocl::imgproc::corner_oclsrc, @@ -420,8 +421,9 @@ static bool ocl_preCornerDetect( InputArray _src, OutputArray _dst, int ksize, i { UMat Dx, Dy, D2x, D2y, Dxy; - Sobel( _src, Dx, CV_32F, 1, 0, ksize, 1, 0, borderType ); - Sobel( _src, Dy, CV_32F, 0, 1, ksize, 1, 0, borderType ); + if (!extractCovData(_src, Dx, Dy, depth, 1, ksize, borderType)) + return false; + Sobel( _src, D2x, CV_32F, 2, 0, ksize, 1, 0, borderType ); Sobel( _src, D2y, CV_32F, 0, 2, ksize, 1, 0, borderType ); Sobel( _src, Dxy, CV_32F, 1, 1, ksize, 1, 0, borderType ); -- GitLab