From: perping Date: Tue, 12 Nov 2013 09:54:03 +0000 (+0800) Subject: fix haar X-Git-Tag: accepted/tizen/ivi/20140515.103456~1^2~277^2~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dee584ee152e25df476878be801b15b4236d3204;p=profile%2Fivi%2Fopencv.git fix haar --- diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index bdf8325..b8c9b85 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -939,7 +939,7 @@ namespace cv Size m_maxSize; vector sizev; vector scalev; - oclMat gimg1, gsum, gsqsum; + oclMat gimg1, gsum, gsqsum, gsqsum_t; void * buffers; }; diff --git a/modules/ocl/src/haar.cpp b/modules/ocl/src/haar.cpp index ff0c007..db3dd46 100644 --- a/modules/ocl/src/haar.cpp +++ b/modules/ocl/src/haar.cpp @@ -747,6 +747,15 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS oclMat gsum(totalheight + 4, gimg.cols + 1, CV_32SC1); oclMat gsqsum(totalheight + 4, gimg.cols + 1, CV_32FC1); + int sdepth = 0; + if(Context::getContext()->supportsFeature(FEATURE_CL_DOUBLE)) + sdepth = CV_64FC1; + else + sdepth = CV_32FC1; + sdepth = CV_MAT_DEPTH(sdepth); + int type = CV_MAKE_TYPE(sdepth, 1); + oclMat gsqsum_t(totalheight + 4, gimg.cols + 1, type); + cl_mem stagebuffer; cl_mem nodebuffer; cl_mem candidatebuffer; @@ -754,15 +763,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS cv::Rect roi, roi2; cv::Mat imgroi, imgroisq; cv::ocl::oclMat resizeroi, gimgroi, gimgroisq; - int sdepth = 0; - if(gsqsum.clCxt->supportsFeature(ocl::FEATURE_CL_DOUBLE)) - sdepth = CV_64FC1; - else - sdepth = CV_32FC1; - sdepth = CV_MAT_DEPTH(sdepth); - int type = CV_MAKE_TYPE(sdepth, 1); - cv::ocl::oclMat gsqsum_t(gsqsum.size(), type); int grp_per_CU = 12; size_t blocksize = 8; @@ -799,7 +800,10 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS indexy += sz.height; } - gsqsum_t.convertTo(gsqsum, CV_32FC1); + if(Context::getContext()->supportsFeature(FEATURE_CL_DOUBLE)) + gsqsum_t.convertTo(gsqsum, CV_32FC1); + else + gsqsum = gsqsum_t; gcascade = (GpuHidHaarClassifierCascade *)cascade->hid_cascade; stage = (GpuHidHaarStageClassifier *)(gcascade + 1); @@ -1007,7 +1011,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS int n_factors = 0; oclMat gsum; oclMat gsqsum; - cv::ocl::oclMat gsqsum_t; + oclMat gsqsum_t; cv::ocl::integral(gimg, gsum, gsqsum_t); gsqsum_t.convertTo(gsqsum, CV_32FC1); CvSize sz; @@ -1277,14 +1281,6 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std cv::Rect roi, roi2; cv::ocl::oclMat resizeroi, gimgroi, gimgroisq; - if(gsqsum.clCxt->supportsFeature(ocl::FEATURE_CL_DOUBLE)) - sdepth = CV_64FC1; - else - sdepth = CV_32FC1; - sdepth = CV_MAT_DEPTH(sdepth); - int type = CV_MAKE_TYPE(sdepth, 1); - - cv::ocl::oclMat gsqsum_t(gsqsum.size(), type); for( int i = 0; i < m_loopcount; i++ ) { @@ -1299,7 +1295,11 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std cv::ocl::integral(resizeroi, gimgroi, gimgroisq); indexy += sz.height; } - gsqsum_t.convertTo(gsqsum, CV_32FC1); + if(Context::getContext()->supportsFeature(FEATURE_CL_DOUBLE)) + gsqsum_t.convertTo(gsqsum, CV_32FC1); + else + gsqsum = gsqsum_t; + gcascade = (GpuHidHaarClassifierCascade *)(cascade->hid_cascade); stage = (GpuHidHaarStageClassifier *)(gcascade + 1); @@ -1360,9 +1360,11 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std } else { - cv::ocl::oclMat gsqsum_t; cv::ocl::integral(gimg, gsum, gsqsum_t); - gsqsum_t.convertTo(gsqsum, CV_32FC1); + if(Context::getContext()->supportsFeature(FEATURE_CL_DOUBLE)) + gsqsum_t.convertTo(gsqsum, CV_32FC1); + else + gsqsum = gsqsum_t; gcascade = (GpuHidHaarClassifierCascade *)cascade->hid_cascade; @@ -1588,6 +1590,7 @@ void cv::ocl::OclCascadeClassifierBuf::CreateFactorRelatedBufs( gimg1.release(); gsum.release(); gsqsum.release(); + gsqsum_t.release(); } else if (!(m_flags & CV_HAAR_SCALE_IMAGE) && (flags & CV_HAAR_SCALE_IMAGE)) { @@ -1662,6 +1665,16 @@ void cv::ocl::OclCascadeClassifierBuf::CreateFactorRelatedBufs( gsum.create(totalheight + 4, cols + 1, CV_32SC1); gsqsum.create(totalheight + 4, cols + 1, CV_32FC1); + int sdepth = 0; + if(Context::getContext()->supportsFeature(FEATURE_CL_DOUBLE)) + sdepth = CV_64FC1; + else + sdepth = CV_32FC1; + sdepth = CV_MAT_DEPTH(sdepth); + int type = CV_MAKE_TYPE(sdepth, 1); + + gsqsum_t.create(totalheight + 4, cols + 1, type); + scaleinfo = (detect_piramid_info *)malloc(sizeof(detect_piramid_info) * loopcount); for( int i = 0; i < loopcount; i++ ) {