Skip to content

Commit cd62f9f

Browse files
Andrey PavlenkoOpenCV Buildbot
Andrey Pavlenko
authored and
OpenCV Buildbot
committed
Merge pull request opencv#1164 from bitwangyaoyao:master_fixHaar
2 parents c5e569d + 3d3e9ab commit cd62f9f

File tree

7 files changed

+55
-791
lines changed

7 files changed

+55
-791
lines changed

modules/ocl/doc/object_detection.rst

+9-10
Original file line numberDiff line numberDiff line change
@@ -12,31 +12,30 @@ Cascade classifier class used for object detection. Supports HAAR cascade classi
1212
class CV_EXPORTS OclCascadeClassifier : public CascadeClassifier
1313
{
1414
public:
15-
OclCascadeClassifier() {};
16-
~OclCascadeClassifier() {};
17-
CvSeq *oclHaarDetectObjects(oclMat &gimg, CvMemStorage *storage,
18-
double scaleFactor,int minNeighbors,
19-
int flags, CvSize minSize = cvSize(0, 0),
20-
CvSize maxSize = cvSize(0, 0));
15+
void detectMultiScale(oclMat &image, CV_OUT std::vector<cv::Rect>& faces,
16+
double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0,
17+
Size minSize = Size(), Size maxSize = Size());
2118
};
2219

2320
ocl::OclCascadeClassifier::oclHaarDetectObjects
2421
------------------------------------------------------
25-
Returns the detected objects by a list of rectangles
22+
Detects objects of different sizes in the input image.
2623

27-
.. ocv:function:: CvSeq* ocl::OclCascadeClassifier::oclHaarDetectObjects(oclMat &gimg, CvMemStorage *storage, double scaleFactor,int minNeighbors, int flags, CvSize minSize = cvSize(0, 0), CvSize maxSize = cvSize(0, 0))
24+
.. ocv:function:: void ocl::OclCascadeClassifier::detectMultiScale(oclMat &image, std::vector<cv::Rect>& faces, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size())
2825
2926
:param image: Matrix of type CV_8U containing an image where objects should be detected.
3027

31-
:param imageobjectsBuff: Buffer to store detected objects (rectangles). If it is empty, it is allocated with the defaultsize. If not empty, the function searches not more than N objects, where N = sizeof(objectsBufers data)/sizeof(cv::Rect).
28+
:param faces: Vector of rectangles where each rectangle contains the detected object.
3229

3330
:param scaleFactor: Parameter specifying how much the image size is reduced at each image scale.
3431

3532
:param minNeighbors: Parameter specifying how many neighbors each candidate rectangle should have to retain it.
3633

3734
:param minSize: Minimum possible object size. Objects smaller than that are ignored.
3835

39-
Detects objects of different sizes in the input image,only tested for face detection now. The function returns the number of detected objects.
36+
:param maxSize: Maximum possible object size. Objects larger than that are ignored.
37+
38+
The function provides a very similar interface with that in CascadeClassifier class, except using oclMat as input image.
4039

4140
ocl::MatchTemplateBuf
4241
---------------------

modules/ocl/include/opencv2/ocl.hpp

-46
Original file line numberDiff line numberDiff line change
@@ -869,59 +869,13 @@ namespace cv
869869
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
870870
///////////////////////////////////////////CascadeClassifier//////////////////////////////////////////////////////////////////
871871
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
872-
873-
#if 0
874872
class CV_EXPORTS OclCascadeClassifier : public cv::CascadeClassifier
875873
{
876874
public:
877-
OclCascadeClassifier() {};
878-
~OclCascadeClassifier() {};
879-
880-
CvSeq* oclHaarDetectObjects(oclMat &gimg, CvMemStorage *storage, double scaleFactor,
881-
int minNeighbors, int flags, CvSize minSize = cvSize(0, 0), CvSize maxSize = cvSize(0, 0));
882-
};
883-
#endif
884-
885-
#if 0
886-
class CV_EXPORTS OclCascadeClassifierBuf : public cv::CascadeClassifier
887-
{
888-
public:
889-
OclCascadeClassifierBuf() :
890-
m_flags(0), initialized(false), m_scaleFactor(0), buffers(NULL) {}
891-
892-
~OclCascadeClassifierBuf() { release(); }
893-
894875
void detectMultiScale(oclMat &image, CV_OUT std::vector<cv::Rect>& faces,
895876
double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0,
896877
Size minSize = Size(), Size maxSize = Size());
897-
void release();
898-
899-
private:
900-
void Init(const int rows, const int cols, double scaleFactor, int flags,
901-
const int outputsz, const size_t localThreads[],
902-
Size minSize, Size maxSize);
903-
void CreateBaseBufs(const int datasize, const int totalclassifier, const int flags, const int outputsz);
904-
void CreateFactorRelatedBufs(const int rows, const int cols, const int flags,
905-
const double scaleFactor, const size_t localThreads[],
906-
Size minSize, Size maxSize);
907-
void GenResult(CV_OUT std::vector<cv::Rect>& faces, const std::vector<cv::Rect> &rectList, const std::vector<int> &rweights);
908-
909-
int m_rows;
910-
int m_cols;
911-
int m_flags;
912-
int m_loopcount;
913-
int m_nodenum;
914-
bool findBiggestObject;
915-
bool initialized;
916-
double m_scaleFactor;
917-
Size m_minSize;
918-
Size m_maxSize;
919-
std::vector<Size> sizev;
920-
std::vector<float> scalev;
921-
oclMat gimg1, gsum, gsqsum;
922-
void * buffers;
923878
};
924-
#endif
925879

926880
/////////////////////////////// Pyramid /////////////////////////////////////
927881
CV_EXPORTS void pyrDown(const oclMat &src, oclMat &dst);

modules/ocl/perf/perf_haar.cpp

+6-47
Original file line numberDiff line numberDiff line change
@@ -44,47 +44,8 @@
4444
//
4545
//M*/
4646
#include "precomp.hpp"
47-
48-
#if 0
49-
5047
///////////// Haar ////////////////////////
51-
namespace cv
52-
{
53-
namespace ocl
54-
{
55-
56-
struct getRect
57-
{
58-
Rect operator()(const CvAvgComp &e) const
59-
{
60-
return e.rect;
61-
}
62-
};
6348

64-
class CascadeClassifier_GPU : public OclCascadeClassifier
65-
{
66-
public:
67-
void detectMultiScale(oclMat &image,
68-
CV_OUT std::vector<cv::Rect>& faces,
69-
double scaleFactor = 1.1,
70-
int minNeighbors = 3, int flags = 0,
71-
Size minSize = Size(),
72-
Size maxSize = Size())
73-
{
74-
(void)maxSize;
75-
MemStorage storage(cvCreateMemStorage(0));
76-
//CvMat img=image;
77-
CvSeq *objs = oclHaarDetectObjects(image, storage, scaleFactor, minNeighbors, flags, minSize);
78-
vector<CvAvgComp> vecAvgComp;
79-
Seq<CvAvgComp>(objs).copyTo(vecAvgComp);
80-
faces.resize(vecAvgComp.size());
81-
std::transform(vecAvgComp.begin(), vecAvgComp.end(), faces.begin(), getRect());
82-
}
83-
84-
};
85-
86-
}
87-
}
8849
PERFTEST(Haar)
8950
{
9051
Mat img = imread(abspath("basketball1.png"), IMREAD_GRAYSCALE);
@@ -106,12 +67,12 @@ PERFTEST(Haar)
10667
SUBTEST << img.cols << "x" << img.rows << "; scale image";
10768
CPU_ON;
10869
faceCascadeCPU.detectMultiScale(img, faces,
109-
1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
70+
1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
11071
CPU_OFF;
11172

11273

11374
vector<Rect> oclfaces;
114-
ocl::CascadeClassifier_GPU faceCascade;
75+
ocl::OclCascadeClassifier faceCascade;
11576

11677
if (!faceCascade.load(abspath("haarcascade_frontalface_alt.xml")))
11778
{
@@ -122,7 +83,7 @@ PERFTEST(Haar)
12283

12384
WARMUP_ON;
12485
faceCascade.detectMultiScale(d_img, oclfaces,
125-
1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
86+
1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
12687
WARMUP_OFF;
12788

12889
if(faces.size() == oclfaces.size())
@@ -134,14 +95,12 @@ PERFTEST(Haar)
13495

13596
GPU_ON;
13697
faceCascade.detectMultiScale(d_img, oclfaces,
137-
1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
98+
1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
13899
GPU_OFF;
139100

140101
GPU_FULL_ON;
141102
d_img.upload(img);
142103
faceCascade.detectMultiScale(d_img, oclfaces,
143-
1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
104+
1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
144105
GPU_FULL_OFF;
145-
}
146-
147-
#endif
106+
}

0 commit comments

Comments
 (0)