From: Vadim Pisarevsky Date: Fri, 12 Nov 2010 20:55:32 +0000 (+0000) Subject: rewrote matchTemplate in C++; added border awareness to crossCorr (ticket #557) X-Git-Tag: accepted/2.0/20130307.220821~4235 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9e7b8d5f6792d5ee9e1f310f9b2885a3e4150fe2;p=profile%2Fivi%2Fopencv.git rewrote matchTemplate in C++; added border awareness to crossCorr (ticket #557) --- diff --git a/modules/imgproc/src/filter.cpp b/modules/imgproc/src/filter.cpp index 100ac1e..19c51b2 100644 --- a/modules/imgproc/src/filter.cpp +++ b/modules/imgproc/src/filter.cpp @@ -2994,15 +2994,18 @@ void filter2D( const Mat& src, Mat& dst, int ddepth, dst.create( src.size(), CV_MAKETYPE(ddepth, src.channels()) ); anchor = normalizeAnchor(anchor, kernel.size()); - if( kernel.cols*kernel.rows >= dft_filter_size /*&& - kernel.cols <= src.cols && kernel.rows <= src.rows*/ ) + if( kernel.cols*kernel.rows >= dft_filter_size ) { Mat temp; if( src.data != dst.data ) - temp = src; + temp = dst; else - src.copyTo(temp); - crossCorr( temp, kernel, dst, anchor, delta, borderType ); + temp.create(dst.size(), dst.type()); + crossCorr( src, kernel, temp, src.size(), + CV_MAKETYPE(ddepth, src.channels()), + anchor, delta, borderType ); + if( temp.data != dst.data ) + temp.copyTo(dst); return; } diff --git a/modules/imgproc/src/precomp.hpp b/modules/imgproc/src/precomp.hpp index 7ea0fdb..dbcfe27 100644 --- a/modules/imgproc/src/precomp.hpp +++ b/modules/imgproc/src/precomp.hpp @@ -92,6 +92,7 @@ static inline Point normalizeAnchor( Point anchor, Size ksize ) void preprocess2DKernel( const Mat& kernel, vector& coords, vector& coeffs ); void crossCorr( const Mat& src, const Mat& templ, Mat& dst, + Size corrsize, int ctype, Point anchor=Point(0,0), double delta=0, int borderType=BORDER_REFLECT_101 ); @@ -124,11 +125,6 @@ void icvSepConvSmall3_32f( float* src, int src_step, float* dst, int dst_step, #undef CV_CALC_MAX #define CV_CALC_MAX(a, b) if((a) < (b)) (a) = (b) -void -icvCrossCorr( const CvArr* _img, const CvArr* _templ, - CvArr* _corr, CvPoint anchor=cvPoint(0,0), - double delta=0, int borderType=IPL_BORDER_REPLICATE); - CvStatus CV_STDCALL icvCopyReplicateBorder_8u( const uchar* src, int srcstep, CvSize srcroi, uchar* dst, int dststep, CvSize dstroi, diff --git a/modules/imgproc/src/utils.cpp b/modules/imgproc/src/utils.cpp index 5080bc5..bd60ba6 100644 --- a/modules/imgproc/src/utils.cpp +++ b/modules/imgproc/src/utils.cpp @@ -442,6 +442,7 @@ cvCopyMakeBorder( const CvArr* srcarr, CvArr* dstarr, CvPoint offset, if( dststep == 0 ) dststep = CV_STUB_STEP; + bordertype &= 15; if( bordertype == IPL_BORDER_REPLICATE ) { icvCopyReplicateBorder_8u( src->data.ptr, srcstep, srcsize, diff --git a/samples/c/image.cpp b/samples/c/image.cpp index 5f1d520..8dda852 100644 --- a/samples/c/image.cpp +++ b/samples/c/image.cpp @@ -4,6 +4,8 @@ using namespace cv; // all the new API is put into "cv" namespace. Export its content +#if 0 + // enable/disable use of mixed API in the code below. #define DEMO_MIXED_API_USE 1 @@ -108,3 +110,30 @@ int main( int argc, char** argv ) // all the memory will automatically be released by Vector<>, Mat and Ptr<> destructors. } +#else + +int main(int argc, char *argv[]) +{ + Mat im(160, 160, CV_32F); + randu(im, Scalar(0.0), Scalar(1.0)); + Mat dd = Mat::zeros(17,1,CV_32F); + Mat lp = Mat::zeros(17,1,CV_32F); + dd.at(0) = 0.5; + dd.at(16) = -0.5; + lp.at(0) = 0.5; + lp.at(16) = 0.5; + int p = 16; + Mat H = dd*lp.t(); + Mat imcrop(im, Rect(17, 17, im.cols-2*p, im.rows-2*p)); + Mat out1, out2; + filter2D(imcrop, out1, CV_32F, H, Point(-1,-1)); + sepFilter2D(imcrop, out2, CV_32F, lp, dd, Point(-1,-1)); + Mat temp; + out1.convertTo(temp, CV_16U, 65535.0, 32768.0); + imshow("filtered1.png", temp); + out2.convertTo(temp, CV_16U, 65535.0, 32768.0); + imshow("filtered2.png", temp); + waitKey(); +} + +#endif