fix some bug about haar and match_template.

pull/1779/head
perping 11 years ago
parent 73b34e3f85
commit 8af626d295
  1. 4
      modules/ocl/perf/perf_match_template.cpp
  2. 34
      modules/ocl/src/haar.cpp
  3. 6
      modules/ocl/src/match_template.cpp

@ -108,13 +108,13 @@ PERF_TEST_P(CV_TM_CCORR_NORMEDFixture, matchTemplate, OCL_TYPICAL_MAT_SIZES)
oclDst.download(dst); oclDst.download(dst);
SANITY_CHECK(dst, 2e-2); SANITY_CHECK(dst, 3e-2);
} }
else if (RUN_PLAIN_IMPL) else if (RUN_PLAIN_IMPL)
{ {
TEST_CYCLE() cv::matchTemplate(src, templ, dst, CV_TM_CCORR_NORMED); TEST_CYCLE() cv::matchTemplate(src, templ, dst, CV_TM_CCORR_NORMED);
SANITY_CHECK(dst, 2e-2); SANITY_CHECK(dst, 3e-2);
} }
else else
OCL_PERF_ELSE OCL_PERF_ELSE

@ -754,6 +754,15 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
cv::Rect roi, roi2; cv::Rect roi, roi2;
cv::Mat imgroi, imgroisq; cv::Mat imgroi, imgroisq;
cv::ocl::oclMat resizeroi, gimgroi, gimgroisq; 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; int grp_per_CU = 12;
size_t blocksize = 8; size_t blocksize = 8;
@ -773,7 +782,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
roi2 = Rect(0, 0, sz.width - 1, sz.height - 1); roi2 = Rect(0, 0, sz.width - 1, sz.height - 1);
resizeroi = gimg1(roi2); resizeroi = gimg1(roi2);
gimgroi = gsum(roi); gimgroi = gsum(roi);
gimgroisq = gsqsum(roi); gimgroisq = gsqsum_t(roi);
int width = gimgroi.cols - 1 - cascade->orig_window_size.width; int width = gimgroi.cols - 1 - cascade->orig_window_size.width;
int height = gimgroi.rows - 1 - cascade->orig_window_size.height; int height = gimgroi.rows - 1 - cascade->orig_window_size.height;
scaleinfo[i].width_height = (width << 16) | height; scaleinfo[i].width_height = (width << 16) | height;
@ -787,8 +796,10 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
scaleinfo[i].factor = factor; scaleinfo[i].factor = factor;
cv::ocl::resize(gimg, resizeroi, Size(sz.width - 1, sz.height - 1), 0, 0, INTER_LINEAR); cv::ocl::resize(gimg, resizeroi, Size(sz.width - 1, sz.height - 1), 0, 0, INTER_LINEAR);
cv::ocl::integral(resizeroi, gimgroi, gimgroisq); cv::ocl::integral(resizeroi, gimgroi, gimgroisq);
indexy += sz.height; indexy += sz.height;
} }
gsqsum_t.convertTo(gsqsum, CV_32FC1);
gcascade = (GpuHidHaarClassifierCascade *)cascade->hid_cascade; gcascade = (GpuHidHaarClassifierCascade *)cascade->hid_cascade;
stage = (GpuHidHaarStageClassifier *)(gcascade + 1); stage = (GpuHidHaarStageClassifier *)(gcascade + 1);
@ -996,7 +1007,9 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
int n_factors = 0; int n_factors = 0;
oclMat gsum; oclMat gsum;
oclMat gsqsum; oclMat gsqsum;
cv::ocl::integral(gimg, gsum, gsqsum); cv::ocl::oclMat gsqsum_t;
cv::ocl::integral(gimg, gsum, gsqsum_t);
gsqsum_t.convertTo(gsqsum, CV_32FC1);
CvSize sz; CvSize sz;
vector<CvSize> sizev; vector<CvSize> sizev;
vector<float> scalev; vector<float> scalev;
@ -1259,10 +1272,19 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std
if( (flags & CV_HAAR_SCALE_IMAGE) ) if( (flags & CV_HAAR_SCALE_IMAGE) )
{ {
int indexy = 0; int indexy = 0;
int sdepth = 0;
CvSize sz; CvSize sz;
cv::Rect roi, roi2; cv::Rect roi, roi2;
cv::ocl::oclMat resizeroi, gimgroi, gimgroisq; 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++ ) for( int i = 0; i < m_loopcount; i++ )
{ {
@ -1271,13 +1293,13 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std
roi2 = Rect(0, 0, sz.width - 1, sz.height - 1); roi2 = Rect(0, 0, sz.width - 1, sz.height - 1);
resizeroi = gimg1(roi2); resizeroi = gimg1(roi2);
gimgroi = gsum(roi); gimgroi = gsum(roi);
gimgroisq = gsqsum(roi); gimgroisq = gsqsum_t(roi);
cv::ocl::resize(gimg, resizeroi, Size(sz.width - 1, sz.height - 1), 0, 0, INTER_LINEAR); cv::ocl::resize(gimg, resizeroi, Size(sz.width - 1, sz.height - 1), 0, 0, INTER_LINEAR);
cv::ocl::integral(resizeroi, gimgroi, gimgroisq); cv::ocl::integral(resizeroi, gimgroi, gimgroisq);
indexy += sz.height; indexy += sz.height;
} }
gsqsum_t.convertTo(gsqsum, CV_32FC1);
gcascade = (GpuHidHaarClassifierCascade *)(cascade->hid_cascade); gcascade = (GpuHidHaarClassifierCascade *)(cascade->hid_cascade);
stage = (GpuHidHaarStageClassifier *)(gcascade + 1); stage = (GpuHidHaarStageClassifier *)(gcascade + 1);
@ -1338,7 +1360,9 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std
} }
else else
{ {
cv::ocl::integral(gimg, gsum, gsqsum); cv::ocl::oclMat gsqsum_t;
cv::ocl::integral(gimg, gsum, gsqsum_t);
gsqsum_t.convertTo(gsqsum, CV_32FC1);
gcascade = (GpuHidHaarClassifierCascade *)cascade->hid_cascade; gcascade = (GpuHidHaarClassifierCascade *)cascade->hid_cascade;

@ -245,12 +245,12 @@ namespace cv
void matchTemplate_CCORR_NORMED( void matchTemplate_CCORR_NORMED(
const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf) const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf)
{ {
cv::ocl::oclMat temp;
matchTemplate_CCORR(image, templ, result, buf); matchTemplate_CCORR(image, templ, result, buf);
buf.image_sums.resize(1); buf.image_sums.resize(1);
buf.image_sqsums.resize(1); buf.image_sqsums.resize(1);
integral(image.reshape(1), buf.image_sums[0], temp);
integral(image.reshape(1), buf.image_sums[0], buf.image_sqsums[0]); temp.convertTo(buf.image_sqsums[0], CV_32FC1);
unsigned long long templ_sqsum = (unsigned long long)sqrSum(templ.reshape(1))[0]; unsigned long long templ_sqsum = (unsigned long long)sqrSum(templ.reshape(1))[0];
Context *clCxt = image.clCxt; Context *clCxt = image.clCxt;

Loading…
Cancel
Save