Commit dee584ee authored by perping's avatar perping

fix haar

parent 8af626d2
...@@ -939,7 +939,7 @@ namespace cv ...@@ -939,7 +939,7 @@ namespace cv
Size m_maxSize; Size m_maxSize;
vector<CvSize> sizev; vector<CvSize> sizev;
vector<float> scalev; vector<float> scalev;
oclMat gimg1, gsum, gsqsum; oclMat gimg1, gsum, gsqsum, gsqsum_t;
void * buffers; void * buffers;
}; };
......
...@@ -747,6 +747,15 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS ...@@ -747,6 +747,15 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
oclMat gsum(totalheight + 4, gimg.cols + 1, CV_32SC1); oclMat gsum(totalheight + 4, gimg.cols + 1, CV_32SC1);
oclMat gsqsum(totalheight + 4, gimg.cols + 1, CV_32FC1); 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 stagebuffer;
cl_mem nodebuffer; cl_mem nodebuffer;
cl_mem candidatebuffer; cl_mem candidatebuffer;
...@@ -754,15 +763,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS ...@@ -754,15 +763,7 @@ 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;
...@@ -799,7 +800,10 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS ...@@ -799,7 +800,10 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
indexy += sz.height; 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; gcascade = (GpuHidHaarClassifierCascade *)cascade->hid_cascade;
stage = (GpuHidHaarStageClassifier *)(gcascade + 1); stage = (GpuHidHaarStageClassifier *)(gcascade + 1);
...@@ -1007,7 +1011,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS ...@@ -1007,7 +1011,7 @@ 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::oclMat gsqsum_t; oclMat gsqsum_t;
cv::ocl::integral(gimg, gsum, gsqsum_t); cv::ocl::integral(gimg, gsum, gsqsum_t);
gsqsum_t.convertTo(gsqsum, CV_32FC1); gsqsum_t.convertTo(gsqsum, CV_32FC1);
CvSize sz; CvSize sz;
...@@ -1277,14 +1281,6 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std ...@@ -1277,14 +1281,6 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std
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++ )
{ {
...@@ -1299,7 +1295,11 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std ...@@ -1299,7 +1295,11 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std
cv::ocl::integral(resizeroi, gimgroi, gimgroisq); cv::ocl::integral(resizeroi, gimgroi, gimgroisq);
indexy += sz.height; 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); gcascade = (GpuHidHaarClassifierCascade *)(cascade->hid_cascade);
stage = (GpuHidHaarStageClassifier *)(gcascade + 1); stage = (GpuHidHaarStageClassifier *)(gcascade + 1);
...@@ -1360,9 +1360,11 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std ...@@ -1360,9 +1360,11 @@ void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std
} }
else else
{ {
cv::ocl::oclMat gsqsum_t;
cv::ocl::integral(gimg, gsum, 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; gcascade = (GpuHidHaarClassifierCascade *)cascade->hid_cascade;
...@@ -1588,6 +1590,7 @@ void cv::ocl::OclCascadeClassifierBuf::CreateFactorRelatedBufs( ...@@ -1588,6 +1590,7 @@ void cv::ocl::OclCascadeClassifierBuf::CreateFactorRelatedBufs(
gimg1.release(); gimg1.release();
gsum.release(); gsum.release();
gsqsum.release(); gsqsum.release();
gsqsum_t.release();
} }
else if (!(m_flags & CV_HAAR_SCALE_IMAGE) && (flags & CV_HAAR_SCALE_IMAGE)) else if (!(m_flags & CV_HAAR_SCALE_IMAGE) && (flags & CV_HAAR_SCALE_IMAGE))
{ {
...@@ -1662,6 +1665,16 @@ void cv::ocl::OclCascadeClassifierBuf::CreateFactorRelatedBufs( ...@@ -1662,6 +1665,16 @@ void cv::ocl::OclCascadeClassifierBuf::CreateFactorRelatedBufs(
gsum.create(totalheight + 4, cols + 1, CV_32SC1); gsum.create(totalheight + 4, cols + 1, CV_32SC1);
gsqsum.create(totalheight + 4, cols + 1, CV_32FC1); 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); scaleinfo = (detect_piramid_info *)malloc(sizeof(detect_piramid_info) * loopcount);
for( int i = 0; i < loopcount; i++ ) for( int i = 0; i < loopcount; i++ )
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment