objdetect.hpp 36.4 KB
Newer Older
1 2 3 4 5 6 7 8 9
/*M///////////////////////////////////////////////////////////////////////////////////////
//
//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
//  By downloading, copying, installing or using the software you agree to this license.
//  If you do not agree to this license, do not download, install,
//  copy or use the software.
//
//
10
//                          License Agreement
11 12 13 14
//                For Open Source Computer Vision Library
//
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
15
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
//   * Redistribution's of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//
//   * Redistribution's in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//
//   * The name of the copyright holders may not be used to endorse or promote products
//     derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/

S
sourin 已提交
44 45
#ifndef OPENCV_OBJDETECT_HPP
#define OPENCV_OBJDETECT_HPP
46

47
#include "opencv2/core.hpp"
48

M
Maksim Shabunin 已提交
49 50 51 52 53 54 55
/**
@defgroup objdetect Object Detection

Haar Feature-based Cascade Classifier for Object Detection
----------------------------------------------------------

The object detector described below has been initially proposed by Paul Viola @cite Viola01 and
56
improved by Rainer Lienhart @cite Lienhart02 .
M
Maksim Shabunin 已提交
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

First, a classifier (namely a *cascade of boosted classifiers working with haar-like features*) is
trained with a few hundred sample views of a particular object (i.e., a face or a car), called
positive examples, that are scaled to the same size (say, 20x20), and negative examples - arbitrary
images of the same size.

After a classifier is trained, it can be applied to a region of interest (of the same size as used
during the training) in an input image. The classifier outputs a "1" if the region is likely to show
the object (i.e., face/car), and "0" otherwise. To search for the object in the whole image one can
move the search window across the image and check every location using the classifier. The
classifier is designed so that it can be easily "resized" in order to be able to find the objects of
interest at different sizes, which is more efficient than resizing the image itself. So, to find an
object of an unknown size in the image the scan procedure should be done several times at different
scales.

The word "cascade" in the classifier name means that the resultant classifier consists of several
simpler classifiers (*stages*) that are applied subsequently to a region of interest until at some
stage the candidate is rejected or all the stages are passed. The word "boosted" means that the
classifiers at every stage of the cascade are complex themselves and they are built out of basic
classifiers using one of four different boosting techniques (weighted voting). Currently Discrete
Adaboost, Real Adaboost, Gentle Adaboost and Logitboost are supported. The basic classifiers are
decision-tree classifiers with at least 2 leaves. Haar-like features are the input to the basic
classifiers, and are calculated as described below. The current algorithm uses the following
Haar-like features:

![image](pics/haarfeatures.png)

The feature used in a particular classifier is specified by its shape (1a, 2b etc.), position within
the region of interest and the scale (this scale is not the same as the scale used at the detection
stage, though these two scales are multiplied). For example, in the case of the third line feature
(2c) the response is calculated as the difference between the sum of image pixels under the
rectangle covering the whole feature (including the two white stripes and the black stripe in the
middle) and the sum of the image pixels under the black stripe multiplied by 3 in order to
compensate for the differences in the size of areas. The sums of pixel values over a rectangular
regions are calculated rapidly using integral images (see below and the integral description).

To see the object detector at work, have a look at the facedetect demo:
94
<https://github.com/opencv/opencv/tree/3.4/samples/cpp/dbt_face_detection.cpp>
M
Maksim Shabunin 已提交
95 96

The following reference is for the detection part only. There is a separate application called
97
opencv_traincascade that can train a cascade of boosted classifiers from a set of samples.
M
Maksim Shabunin 已提交
98 99 100 101 102 103 104 105 106 107 108

@note In the new C++ interface it is also possible to use LBP (local binary pattern) features in
addition to Haar-like features. .. [Viola01] Paul Viola and Michael J. Jones. Rapid Object Detection
using a Boosted Cascade of Simple Features. IEEE CVPR, 2001. The paper is available online at
<http://research.microsoft.com/en-us/um/people/viola/Pubs/Detect/violaJones_CVPR2001.pdf>

@{
    @defgroup objdetect_c C API
@}
 */

109
typedef struct CvHaarClassifierCascade CvHaarClassifierCascade;
A
Alexey Kazakov 已提交
110

111 112
namespace cv
{
A
Andrey Kamaev 已提交
113

M
Maksim Shabunin 已提交
114 115 116
//! @addtogroup objdetect
//! @{

117 118
///////////////////////////// Object Detection ////////////////////////////

M
Maksim Shabunin 已提交
119 120
//! class for grouping object candidates, detected by Cascade Classifier, HOG etc.
//! instance of the class is to be passed to cv::partition (see cxoperations.hpp)
121 122 123 124 125 126
class CV_EXPORTS SimilarRects
{
public:
    SimilarRects(double _eps) : eps(_eps) {}
    inline bool operator()(const Rect& r1, const Rect& r2) const
    {
127
        double delta = eps * ((std::min)(r1.width, r2.width) + (std::min)(r1.height, r2.height)) * 0.5;
128 129 130 131 132 133 134 135
        return std::abs(r1.x - r2.x) <= delta &&
            std::abs(r1.y - r2.y) <= delta &&
            std::abs(r1.x + r1.width - r2.x - r2.width) <= delta &&
            std::abs(r1.y + r1.height - r2.y - r2.height) <= delta;
    }
    double eps;
};

M
Maksim Shabunin 已提交
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
/** @brief Groups the object candidate rectangles.

@param rectList Input/output vector of rectangles. Output vector includes retained and grouped
rectangles. (The Python list is not modified in place.)
@param groupThreshold Minimum possible number of rectangles minus 1. The threshold is used in a
group of rectangles to retain it.
@param eps Relative difference between sides of the rectangles to merge them into a group.

The function is a wrapper for the generic function partition . It clusters all the input rectangles
using the rectangle equivalence criteria that combines rectangles with similar sizes and similar
locations. The similarity is defined by eps. When eps=0 , no clustering is done at all. If
\f$\texttt{eps}\rightarrow +\inf\f$ , all the rectangles are put in one cluster. Then, the small
clusters containing less than or equal to groupThreshold rectangles are rejected. In each other
cluster, the average rectangle is computed and put into the output rectangle list.
 */
151
CV_EXPORTS   void groupRectangles(std::vector<Rect>& rectList, int groupThreshold, double eps = 0.2);
M
Maksim Shabunin 已提交
152
/** @overload */
153 154
CV_EXPORTS_W void groupRectangles(CV_IN_OUT std::vector<Rect>& rectList, CV_OUT std::vector<int>& weights,
                                  int groupThreshold, double eps = 0.2);
M
Maksim Shabunin 已提交
155
/** @overload */
156 157
CV_EXPORTS   void groupRectangles(std::vector<Rect>& rectList, int groupThreshold,
                                  double eps, std::vector<int>* weights, std::vector<double>* levelWeights );
M
Maksim Shabunin 已提交
158
/** @overload */
159 160
CV_EXPORTS   void groupRectangles(std::vector<Rect>& rectList, std::vector<int>& rejectLevels,
                                  std::vector<double>& levelWeights, int groupThreshold, double eps = 0.2);
M
Maksim Shabunin 已提交
161
/** @overload */
162 163 164
CV_EXPORTS   void groupRectangles_meanshift(std::vector<Rect>& rectList, std::vector<double>& foundWeights,
                                            std::vector<double>& foundScales,
                                            double detectThreshold = 0.0, Size winDetSize = Size(64, 128));
165

R
Roman Donchenko 已提交
166
template<> CV_EXPORTS void DefaultDeleter<CvHaarClassifierCascade>::operator ()(CvHaarClassifierCascade* obj) const;
167

168 169 170 171 172
enum { CASCADE_DO_CANNY_PRUNING    = 1,
       CASCADE_SCALE_IMAGE         = 2,
       CASCADE_FIND_BIGGEST_OBJECT = 4,
       CASCADE_DO_ROUGH_SEARCH     = 8
     };
173

174
class CV_EXPORTS_W BaseCascadeClassifier : public Algorithm
175 176
{
public:
177
    virtual ~BaseCascadeClassifier();
178
    virtual bool empty() const CV_OVERRIDE = 0;
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
    virtual bool load( const String& filename ) = 0;
    virtual void detectMultiScale( InputArray image,
                           CV_OUT std::vector<Rect>& objects,
                           double scaleFactor,
                           int minNeighbors, int flags,
                           Size minSize, Size maxSize ) = 0;

    virtual void detectMultiScale( InputArray image,
                           CV_OUT std::vector<Rect>& objects,
                           CV_OUT std::vector<int>& numDetections,
                           double scaleFactor,
                           int minNeighbors, int flags,
                           Size minSize, Size maxSize ) = 0;

    virtual void detectMultiScale( InputArray image,
194
                                   CV_OUT std::vector<Rect>& objects,
195 196
                                   CV_OUT std::vector<int>& rejectLevels,
                                   CV_OUT std::vector<double>& levelWeights,
197 198 199 200
                                   double scaleFactor,
                                   int minNeighbors, int flags,
                                   Size minSize, Size maxSize,
                                   bool outputRejectLevels ) = 0;
201

202 203 204 205
    virtual bool isOldFormatCascade() const = 0;
    virtual Size getOriginalWindowSize() const = 0;
    virtual int getFeatureType() const = 0;
    virtual void* getOldCascade() = 0;
206

207
    class CV_EXPORTS MaskGenerator
208
    {
209
    public:
A
Andrey Kamaev 已提交
210
        virtual ~MaskGenerator() {}
211
        virtual Mat generateMask(const Mat& src)=0;
212
        virtual void initializeMask(const Mat& /*src*/) { }
213
    };
214 215 216
    virtual void setMaskGenerator(const Ptr<MaskGenerator>& maskGenerator) = 0;
    virtual Ptr<MaskGenerator> getMaskGenerator() = 0;
};
217

218
/** @example samples/cpp/facedetect.cpp
S
Suleyman TURKMEN 已提交
219 220
This program demonstrates usage of the Cascade classifier class
\image html Cascade_Classifier_Tutorial_Result_Haar.jpg "Sample screenshot" width=321 height=254
221
*/
M
Maksim Shabunin 已提交
222 223
/** @brief Cascade classifier class for object detection.
 */
224
class CV_EXPORTS_W CascadeClassifier
225 226 227
{
public:
    CV_WRAP CascadeClassifier();
M
Maksim Shabunin 已提交
228 229 230 231
    /** @brief Loads a classifier from a file.

    @param filename Name of the file from which the classifier is loaded.
     */
232
    CV_WRAP CascadeClassifier(const String& filename);
233
    ~CascadeClassifier();
M
Maksim Shabunin 已提交
234 235
    /** @brief Checks whether the classifier has been loaded.
    */
236
    CV_WRAP bool empty() const;
M
Maksim Shabunin 已提交
237 238 239 240 241 242
    /** @brief Loads a classifier from a file.

    @param filename Name of the file from which the classifier is loaded. The file may contain an old
    HAAR classifier trained by the haartraining application or a new cascade classifier trained by the
    traincascade application.
     */
243
    CV_WRAP bool load( const String& filename );
M
Maksim Shabunin 已提交
244 245 246 247
    /** @brief Reads a classifier from a FileStorage node.

    @note The file may contain a new cascade classifier (trained traincascade application) only.
     */
248
    CV_WRAP bool read( const FileNode& node );
M
Maksim Shabunin 已提交
249 250 251 252

    /** @brief Detects objects of different sizes in the input image. The detected objects are returned as a list
    of rectangles.

253
    @param image Matrix of the type CV_8U containing an image where objects are detected.
M
Maksim Shabunin 已提交
254 255 256 257 258 259 260 261
    @param objects Vector of rectangles where each rectangle contains the detected object, the
    rectangles may be partially outside the original image.
    @param scaleFactor Parameter specifying how much the image size is reduced at each image scale.
    @param minNeighbors Parameter specifying how many neighbors each candidate rectangle should have
    to retain it.
    @param flags Parameter with the same meaning for an old cascade as in the function
    cvHaarDetectObjects. It is not used for a new cascade.
    @param minSize Minimum possible object size. Objects smaller than that are ignored.
262
    @param maxSize Maximum possible object size. Objects larger than that are ignored. If `maxSize == minSize` model is evaluated on single scale.
M
Maksim Shabunin 已提交
263 264 265 266 267

    The function is parallelized with the TBB library.

    @note
       -   (Python) A face detection example using cascade classifiers can be found at
268
            opencv_source_code/samples/python/facedetect.py
M
Maksim Shabunin 已提交
269
    */
270 271 272 273 274 275 276
    CV_WRAP void detectMultiScale( InputArray image,
                          CV_OUT std::vector<Rect>& objects,
                          double scaleFactor = 1.1,
                          int minNeighbors = 3, int flags = 0,
                          Size minSize = Size(),
                          Size maxSize = Size() );

M
Maksim Shabunin 已提交
277
    /** @overload
278
    @param image Matrix of the type CV_8U containing an image where objects are detected.
M
Maksim Shabunin 已提交
279 280 281 282 283 284 285 286 287 288 289
    @param objects Vector of rectangles where each rectangle contains the detected object, the
    rectangles may be partially outside the original image.
    @param numDetections Vector of detection numbers for the corresponding objects. An object's number
    of detections is the number of neighboring positively classified rectangles that were joined
    together to form the object.
    @param scaleFactor Parameter specifying how much the image size is reduced at each image scale.
    @param minNeighbors Parameter specifying how many neighbors each candidate rectangle should have
    to retain it.
    @param flags Parameter with the same meaning for an old cascade as in the function
    cvHaarDetectObjects. It is not used for a new cascade.
    @param minSize Minimum possible object size. Objects smaller than that are ignored.
290
    @param maxSize Maximum possible object size. Objects larger than that are ignored. If `maxSize == minSize` model is evaluated on single scale.
M
Maksim Shabunin 已提交
291
    */
292
    CV_WRAP_AS(detectMultiScale2) void detectMultiScale( InputArray image,
293 294 295 296 297 298 299
                          CV_OUT std::vector<Rect>& objects,
                          CV_OUT std::vector<int>& numDetections,
                          double scaleFactor=1.1,
                          int minNeighbors=3, int flags=0,
                          Size minSize=Size(),
                          Size maxSize=Size() );

M
Maksim Shabunin 已提交
300
    /** @overload
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
    This function allows you to retrieve the final stage decision certainty of classification.
    For this, one needs to set `outputRejectLevels` on true and provide the `rejectLevels` and `levelWeights` parameter.
    For each resulting detection, `levelWeights` will then contain the certainty of classification at the final stage.
    This value can then be used to separate strong from weaker classifications.

    A code sample on how to use it efficiently can be found below:
    @code
    Mat img;
    vector<double> weights;
    vector<int> levels;
    vector<Rect> detections;
    CascadeClassifier model("/path/to/your/model.xml");
    model.detectMultiScale(img, detections, levels, weights, 1.1, 3, 0, Size(), Size(), true);
    cerr << "Detection " << detections[0] << " with weight " << weights[0] << endl;
    @endcode
M
Maksim Shabunin 已提交
316
    */
317
    CV_WRAP_AS(detectMultiScale3) void detectMultiScale( InputArray image,
318 319 320 321 322 323 324 325 326
                                  CV_OUT std::vector<Rect>& objects,
                                  CV_OUT std::vector<int>& rejectLevels,
                                  CV_OUT std::vector<double>& levelWeights,
                                  double scaleFactor = 1.1,
                                  int minNeighbors = 3, int flags = 0,
                                  Size minSize = Size(),
                                  Size maxSize = Size(),
                                  bool outputRejectLevels = false );

327 328 329 330
    CV_WRAP bool isOldFormatCascade() const;
    CV_WRAP Size getOriginalWindowSize() const;
    CV_WRAP int getFeatureType() const;
    void* getOldCascade();
331

332 333
    CV_WRAP static bool convert(const String& oldcascade, const String& newcascade);

334 335
    void setMaskGenerator(const Ptr<BaseCascadeClassifier::MaskGenerator>& maskGenerator);
    Ptr<BaseCascadeClassifier::MaskGenerator> getMaskGenerator();
336

337
    Ptr<BaseCascadeClassifier> cc;
338 339
};

340
CV_EXPORTS Ptr<BaseCascadeClassifier::MaskGenerator> createFaceDetectionMaskGenerator();
341

342 343
//////////////// HOG (Histogram-of-Oriented-Gradients) Descriptor and Object Detector //////////////

M
Maksim Shabunin 已提交
344
//! struct for detection region of interest (ROI)
345 346
struct DetectionROI
{
M
Maksim Shabunin 已提交
347
   //! scale(size) of the bounding box
348
   double scale;
L
luz.paz 已提交
349
   //! set of requested locations to be evaluated
350
   std::vector<cv::Point> locations;
M
Maksim Shabunin 已提交
351
   //! vector that will contain confidence values for each location
352
   std::vector<double> confidences;
353 354
};

355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
/**@brief Implementation of HOG (Histogram of Oriented Gradients) descriptor and object detector.

the HOG descriptor algorithm introduced by Navneet Dalal and Bill Triggs @cite Dalal2005 .

useful links:

https://hal.inria.fr/inria-00548512/document/

https://en.wikipedia.org/wiki/Histogram_of_oriented_gradients

https://software.intel.com/en-us/ipp-dev-reference-histogram-of-oriented-gradients-hog-descriptor

http://www.learnopencv.com/histogram-of-oriented-gradients

http://www.learnopencv.com/handwritten-digits-classification-an-opencv-c-python-tutorial

371
 */
372
struct CV_EXPORTS_W HOGDescriptor
373 374
{
public:
375
    enum { L2Hys = 0 //!< Default histogramNormType
376
         };
377
    enum { DEFAULT_NLEVELS = 64 //!< Default nlevels value.
378
         };
379
    /**@brief Creates the HOG descriptor and detector with default params.
A
Andrey Kamaev 已提交
380

381 382
    aqual to HOGDescriptor(Size(64,128), Size(16,16), Size(8,8), Size(8,8), 9, 1 )
    */
383
    CV_WRAP HOGDescriptor() : winSize(64,128), blockSize(16,16), blockStride(8,8),
384
        cellSize(8,8), nbins(9), derivAperture(1), winSigma(-1),
A
Andrey Kamaev 已提交
385
        histogramNormType(HOGDescriptor::L2Hys), L2HysThreshold(0.2), gammaCorrection(true),
386
        free_coef(-1.f), nlevels(HOGDescriptor::DEFAULT_NLEVELS), signedGradient(false)
387
    {}
A
Andrey Kamaev 已提交
388

389 390 391 392 393 394 395 396 397 398 399 400 401 402
    /** @overload
    @param _winSize sets winSize with given value.
    @param _blockSize sets blockSize with given value.
    @param _blockStride sets blockStride with given value.
    @param _cellSize sets cellSize with given value.
    @param _nbins sets nbins with given value.
    @param _derivAperture sets derivAperture with given value.
    @param _winSigma sets winSigma with given value.
    @param _histogramNormType sets histogramNormType with given value.
    @param _L2HysThreshold sets L2HysThreshold with given value.
    @param _gammaCorrection sets gammaCorrection with given value.
    @param _nlevels sets nlevels with given value.
    @param _signedGradient sets signedGradient with given value.
    */
403
    CV_WRAP HOGDescriptor(Size _winSize, Size _blockSize, Size _blockStride,
404
                  Size _cellSize, int _nbins, int _derivAperture=1, double _winSigma=-1,
V
Vadim Pisarevsky 已提交
405
                  int _histogramNormType=HOGDescriptor::L2Hys,
V
Vadim Pisarevsky 已提交
406
                  double _L2HysThreshold=0.2, bool _gammaCorrection=false,
407
                  int _nlevels=HOGDescriptor::DEFAULT_NLEVELS, bool _signedGradient=false)
408 409 410
    : winSize(_winSize), blockSize(_blockSize), blockStride(_blockStride), cellSize(_cellSize),
    nbins(_nbins), derivAperture(_derivAperture), winSigma(_winSigma),
    histogramNormType(_histogramNormType), L2HysThreshold(_L2HysThreshold),
411
    gammaCorrection(_gammaCorrection), free_coef(-1.f), nlevels(_nlevels), signedGradient(_signedGradient)
412
    {}
A
Andrey Kamaev 已提交
413

414 415 416
    /** @overload
    @param filename the file name containing  HOGDescriptor properties and coefficients of the trained classifier
    */
417
    CV_WRAP HOGDescriptor(const String& filename)
418 419 420
    {
        load(filename);
    }
A
Andrey Kamaev 已提交
421

422 423 424
    /** @overload
    @param d the HOGDescriptor which cloned to create a new one.
    */
425 426 427 428
    HOGDescriptor(const HOGDescriptor& d)
    {
        d.copyTo(*this);
    }
A
Andrey Kamaev 已提交
429

430 431
    /**@brief Default destructor.
    */
432
    virtual ~HOGDescriptor() {}
A
Andrey Kamaev 已提交
433

434 435
    /**@brief Returns the number of coefficients required for the classification.
    */
436
    CV_WRAP size_t getDescriptorSize() const;
437 438 439

    /** @brief Checks if detector size equal to descriptor size.
    */
440
    CV_WRAP bool checkDetectorSize() const;
441 442 443

    /** @brief Returns winSigma value
    */
444
    CV_WRAP double getWinSigma() const;
A
Andrey Kamaev 已提交
445

446
    /**@example samples/cpp/peopledetect.cpp
447 448 449 450
    */
    /**@brief Sets coefficients for the linear SVM classifier.
    @param _svmdetector coefficients for the linear SVM classifier.
    */
451
    CV_WRAP virtual void setSVMDetector(InputArray _svmdetector);
A
Andrey Kamaev 已提交
452

453 454 455
    /** @brief Reads HOGDescriptor parameters from a file node.
    @param fn File node
    */
456
    virtual bool read(FileNode& fn);
457 458 459 460 461

    /** @brief Stores HOGDescriptor parameters in a file storage.
    @param fs File storage
    @param objname Object name
    */
462
    virtual void write(FileStorage& fs, const String& objname) const;
A
Andrey Kamaev 已提交
463

464 465 466 467
    /** @brief loads coefficients for the linear SVM classifier from a file
    @param filename Name of the file to read.
    @param objname The optional name of the node to read (if empty, the first top-level node will be used).
    */
468
    CV_WRAP virtual bool load(const String& filename, const String& objname = String());
469 470 471 472 473

    /** @brief saves coefficients for the linear SVM classifier to a file
    @param filename File name
    @param objname Object name
    */
474
    CV_WRAP virtual void save(const String& filename, const String& objname = String()) const;
475 476 477 478

    /** @brief clones the HOGDescriptor
    @param c cloned HOGDescriptor
    */
479
    virtual void copyTo(HOGDescriptor& c) const;
480

481
    /**@example samples/cpp/train_HOG.cpp
482 483 484 485 486 487 488 489
    */
    /** @brief Computes HOG descriptors of given image.
    @param img Matrix of the type CV_8U containing an image where HOG features will be calculated.
    @param descriptors Matrix of the type CV_32F
    @param winStride Window stride. It must be a multiple of block stride.
    @param padding Padding
    @param locations Vector of Point
    */
K
HOG  
Konstantin Matskevich 已提交
490
    CV_WRAP virtual void compute(InputArray img,
491
                         CV_OUT std::vector<float>& descriptors,
492 493
                         Size winStride = Size(), Size padding = Size(),
                         const std::vector<Point>& locations = std::vector<Point>()) const;
K
HOG  
Konstantin Matskevich 已提交
494

495 496 497 498 499
    /** @brief Performs object detection without a multi-scale window.
    @param img Matrix of the type CV_8U or CV_8UC3 containing an image where objects are detected.
    @param foundLocations Vector of point where each point contains left-top corner point of detected object boundaries.
    @param weights Vector that will contain confidence values for each detected object.
    @param hitThreshold Threshold for the distance between features and SVM classifying plane.
L
luz.paz 已提交
500
    Usually it is 0 and should be specified in the detector coefficients (as the last free coefficient).
501 502 503
    But if the free coefficient is omitted (which is allowed), you can specify it manually here.
    @param winStride Window stride. It must be a multiple of block stride.
    @param padding Padding
L
luz.paz 已提交
504
    @param searchLocations Vector of Point includes set of requested locations to be evaluated.
505
    */
506 507
    CV_WRAP virtual void detect(const Mat& img, CV_OUT std::vector<Point>& foundLocations,
                        CV_OUT std::vector<double>& weights,
508 509 510
                        double hitThreshold = 0, Size winStride = Size(),
                        Size padding = Size(),
                        const std::vector<Point>& searchLocations = std::vector<Point>()) const;
511 512 513 514 515

    /** @brief Performs object detection without a multi-scale window.
    @param img Matrix of the type CV_8U or CV_8UC3 containing an image where objects are detected.
    @param foundLocations Vector of point where each point contains left-top corner point of detected object boundaries.
    @param hitThreshold Threshold for the distance between features and SVM classifying plane.
L
luz.paz 已提交
516
    Usually it is 0 and should be specified in the detector coefficients (as the last free coefficient).
517 518 519 520 521
    But if the free coefficient is omitted (which is allowed), you can specify it manually here.
    @param winStride Window stride. It must be a multiple of block stride.
    @param padding Padding
    @param searchLocations Vector of Point includes locations to search.
    */
522
    virtual void detect(const Mat& img, CV_OUT std::vector<Point>& foundLocations,
523 524
                        double hitThreshold = 0, Size winStride = Size(),
                        Size padding = Size(),
525
                        const std::vector<Point>& searchLocations=std::vector<Point>()) const;
K
fixes  
Konstantin Matskevich 已提交
526

527 528 529 530 531 532
    /** @brief Detects objects of different sizes in the input image. The detected objects are returned as a list
    of rectangles.
    @param img Matrix of the type CV_8U or CV_8UC3 containing an image where objects are detected.
    @param foundLocations Vector of rectangles where each rectangle contains the detected object.
    @param foundWeights Vector that will contain confidence values for each detected object.
    @param hitThreshold Threshold for the distance between features and SVM classifying plane.
L
luz.paz 已提交
533
    Usually it is 0 and should be specified in the detector coefficients (as the last free coefficient).
534 535 536 537 538 539 540
    But if the free coefficient is omitted (which is allowed), you can specify it manually here.
    @param winStride Window stride. It must be a multiple of block stride.
    @param padding Padding
    @param scale Coefficient of the detection window increase.
    @param finalThreshold Final threshold
    @param useMeanshiftGrouping indicates grouping algorithm
    */
K
HOG  
Konstantin Matskevich 已提交
541
    CV_WRAP virtual void detectMultiScale(InputArray img, CV_OUT std::vector<Rect>& foundLocations,
542 543 544
                                  CV_OUT std::vector<double>& foundWeights, double hitThreshold = 0,
                                  Size winStride = Size(), Size padding = Size(), double scale = 1.05,
                                  double finalThreshold = 2.0,bool useMeanshiftGrouping = false) const;
545 546 547 548 549 550

    /** @brief Detects objects of different sizes in the input image. The detected objects are returned as a list
    of rectangles.
    @param img Matrix of the type CV_8U or CV_8UC3 containing an image where objects are detected.
    @param foundLocations Vector of rectangles where each rectangle contains the detected object.
    @param hitThreshold Threshold for the distance between features and SVM classifying plane.
L
luz.paz 已提交
551
    Usually it is 0 and should be specified in the detector coefficients (as the last free coefficient).
552 553 554 555 556 557 558
    But if the free coefficient is omitted (which is allowed), you can specify it manually here.
    @param winStride Window stride. It must be a multiple of block stride.
    @param padding Padding
    @param scale Coefficient of the detection window increase.
    @param finalThreshold Final threshold
    @param useMeanshiftGrouping indicates grouping algorithm
    */
K
HOG  
Konstantin Matskevich 已提交
559
    virtual void detectMultiScale(InputArray img, CV_OUT std::vector<Rect>& foundLocations,
560 561 562
                                  double hitThreshold = 0, Size winStride = Size(),
                                  Size padding = Size(), double scale = 1.05,
                                  double finalThreshold = 2.0, bool useMeanshiftGrouping = false) const;
563

564 565 566 567 568 569 570
    /** @brief  Computes gradients and quantized gradient orientations.
    @param img Matrix contains the image to be computed
    @param grad Matrix of type CV_32FC2 contains computed gradients
    @param angleOfs Matrix of type CV_8UC2 contains quantized gradient orientations
    @param paddingTL Padding from top-left
    @param paddingBR Padding from bottom-right
    */
571
    CV_WRAP virtual void computeGradient(const Mat& img, CV_OUT Mat& grad, CV_OUT Mat& angleOfs,
572
                                 Size paddingTL = Size(), Size paddingBR = Size()) const;
A
Andrey Kamaev 已提交
573

574 575
    /** @brief Returns coefficients of the classifier trained for people detection (for 64x128 windows).
    */
576
    CV_WRAP static std::vector<float> getDefaultPeopleDetector();
577

578
    /**@example samples/tapi/hog.cpp
579 580 581
    */
    /** @brief Returns coefficients of the classifier trained for people detection (for 48x96 windows).
    */
582
    CV_WRAP static std::vector<float> getDaimlerPeopleDetector();
A
Andrey Kamaev 已提交
583

584
    //! Detection window size. Align to block size and block stride. Default value is Size(64,128).
585
    CV_PROP Size winSize;
586 587

    //! Block size in pixels. Align to cell size. Default value is Size(16,16).
588
    CV_PROP Size blockSize;
589 590

    //! Block stride. It must be a multiple of cell size. Default value is Size(8,8).
591
    CV_PROP Size blockStride;
592 593

    //! Cell size. Default value is Size(8,8).
594
    CV_PROP Size cellSize;
595 596

    //! Number of bins used in the calculation of histogram of gradients. Default value is 9.
597
    CV_PROP int nbins;
598 599

    //! not documented
600
    CV_PROP int derivAperture;
601 602

    //! Gaussian smoothing window parameter.
603
    CV_PROP double winSigma;
604 605

    //! histogramNormType
606
    CV_PROP int histogramNormType;
607 608

    //! L2-Hys normalization method shrinkage.
609
    CV_PROP double L2HysThreshold;
610 611

    //! Flag to specify whether the gamma correction preprocessing is required or not.
612
    CV_PROP bool gammaCorrection;
613 614

    //! coefficients for the linear SVM classifier.
615
    CV_PROP std::vector<float> svmDetector;
616 617

    //! coefficients for the linear SVM classifier used when OpenCL is enabled
K
Konstantin Matskevich 已提交
618
    UMat oclSvmDetector;
619 620

    //! not documented
K
fixes  
Konstantin Matskevich 已提交
621
    float free_coef;
622 623

    //! Maximum number of detection window increases. Default value is 64
624
    CV_PROP int nlevels;
625

626 627
    //! Indicates signed gradient will be used or not
    CV_PROP bool signedGradient;
628

629 630 631 632 633 634
    /** @brief evaluate specified ROI and return confidence value for each location
    @param img Matrix of the type CV_8U or CV_8UC3 containing an image where objects are detected.
    @param locations Vector of Point
    @param foundLocations Vector of Point where each Point is detected object's top-left point.
    @param confidences confidences
    @param hitThreshold Threshold for the distance between features and SVM classifying plane. Usually
L
luz.paz 已提交
635
    it is 0 and should be specified in the detector coefficients (as the last free coefficient). But if
636 637 638 639
    the free coefficient is omitted (which is allowed), you can specify it manually here
    @param winStride winStride
    @param padding padding
    */
K
fixes  
Konstantin Matskevich 已提交
640
    virtual void detectROI(const cv::Mat& img, const std::vector<cv::Point> &locations,
641 642 643 644
                                   CV_OUT std::vector<cv::Point>& foundLocations, CV_OUT std::vector<double>& confidences,
                                   double hitThreshold = 0, cv::Size winStride = Size(),
                                   cv::Size padding = Size()) const;

645 646 647 648
    /** @brief evaluate specified ROI and return confidence value for each location in multiple scales
    @param img Matrix of the type CV_8U or CV_8UC3 containing an image where objects are detected.
    @param foundLocations Vector of rectangles where each rectangle contains the detected object.
    @param locations Vector of DetectionROI
L
luz.paz 已提交
649
    @param hitThreshold Threshold for the distance between features and SVM classifying plane. Usually it is 0 and should be specified
650 651 652
    in the detector coefficients (as the last free coefficient). But if the free coefficient is omitted (which is allowed), you can specify it manually here.
    @param groupThreshold Minimum possible number of rectangles minus 1. The threshold is used in a group of rectangles to retain it.
    */
K
fixes  
Konstantin Matskevich 已提交
653
    virtual void detectMultiScaleROI(const cv::Mat& img,
654 655 656 657
                                     CV_OUT std::vector<cv::Rect>& foundLocations,
                                     std::vector<DetectionROI>& locations,
                                     double hitThreshold = 0,
                                     int groupThreshold = 0) const;
658

659 660 661
    /** @brief read/parse Dalal's alt model file
    @param modelfile Path of Dalal's alt model file.
    */
K
fixes  
Konstantin Matskevich 已提交
662
    void readALTModel(String modelfile);
663 664 665 666 667 668 669

    /** @brief Groups the object candidate rectangles.
    @param rectList  Input/output vector of rectangles. Output vector includes retained and grouped rectangles. (The Python list is not modified in place.)
    @param weights Input/output vector of weights of rectangles. Output vector includes weights of retained and grouped rectangles. (The Python list is not modified in place.)
    @param groupThreshold Minimum possible number of rectangles minus 1. The threshold is used in a group of rectangles to retain it.
    @param eps Relative difference between sides of the rectangles to merge them into a group.
    */
K
fixes  
Konstantin Matskevich 已提交
670
    void groupRectangles(std::vector<cv::Rect>& rectList, std::vector<double>& weights, int groupThreshold, double eps) const;
671 672
};

673
class CV_EXPORTS_W QRCodeDetector
674 675
{
public:
676
    CV_WRAP QRCodeDetector();
677 678
    ~QRCodeDetector();

679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697
    /** @brief sets the epsilon used during the horizontal scan of QR code stop marker detection.
     @param epsX Epsilon neighborhood, which allows you to determine the horizontal pattern
     of the scheme 1:1:3:1:1 according to QR code standard.
    */
    CV_WRAP void setEpsX(double epsX);
    /** @brief sets the epsilon used during the vertical scan of QR code stop marker detection.
     @param epsY Epsilon neighborhood, which allows you to determine the vertical pattern
     of the scheme 1:1:3:1:1 according to QR code standard.
     */
    CV_WRAP void setEpsY(double epsY);

    /** @brief Detects QR code in image and returns the quadrangle containing the code.
     @param img grayscale or color (BGR) image containing (or not) QR code.
     @param points Output vector of vertices of the minimum-area quadrangle containing the code.
     */
    CV_WRAP bool detect(InputArray img, OutputArray points) const;

    /** @brief Decodes QR code in image once it's found by the detect() method.
     Returns UTF8-encoded output string or empty string if the code cannot be decoded.
698

699 700 701 702 703 704 705 706 707 708 709 710 711 712
     @param img grayscale or color (BGR) image containing QR code.
     @param points Quadrangle vertices found by detect() method (or some other algorithm).
     @param straight_qrcode The optional output image containing rectified and binarized QR code
     */
    CV_WRAP cv::String decode(InputArray img, InputArray points, OutputArray straight_qrcode = noArray());

    /** @brief Both detects and decodes QR code

     @param img grayscale or color (BGR) image containing QR code.
     @param points opiotnal output array of vertices of the found QR code quadrangle. Will be empty if not found.
     @param straight_qrcode The optional output image containing rectified and binarized QR code
     */
    CV_WRAP cv::String detectAndDecode(InputArray img, OutputArray points=noArray(),
                                        OutputArray straight_qrcode = noArray());
713 714 715 716 717
protected:
    struct Impl;
    Ptr<Impl> p;
};

N
Nesterov Alexander 已提交
718 719 720 721 722 723 724 725
/** @brief Detect QR code in image and return minimum area of quadrangle that describes QR code.
    @param in  Matrix of the type CV_8UC1 containing an image where QR code are detected.
    @param points Output vector of vertices of a quadrangle of minimal area that describes QR code.
    @param eps_x Epsilon neighborhood, which allows you to determine the horizontal pattern of the scheme 1:1:3:1:1 according to QR code standard.
    @param eps_y Epsilon neighborhood, which allows you to determine the vertical pattern of the scheme 1:1:3:1:1 according to QR code standard.
    */
CV_EXPORTS bool detectQRCode(InputArray in, std::vector<Point> &points, double eps_x = 0.2, double eps_y = 0.1);

A
Alexander Nesterov 已提交
726 727 728 729 730 731 732
/** @brief Decode QR code in image and return text that is encrypted in QR code.
    @param in  Matrix of the type CV_8UC1 containing an image where QR code are detected.
    @param points Input vector of vertices of a quadrangle of minimal area that describes QR code.
    @param decoded_info String information that is encrypted in QR code.
    @param straight_qrcode Matrix of the type CV_8UC1 containing an binary straight QR code.
    */
CV_EXPORTS bool decodeQRCode(InputArray in, InputArray points, std::string &decoded_info, OutputArray straight_qrcode = noArray());
M
Maksim Shabunin 已提交
733

734
//! @} objdetect
735 736
}

737
#include "opencv2/objdetect/detection_based_tracker.hpp"
738

739 740 741 742
#ifndef DISABLE_OPENCV_24_COMPATIBILITY
#include "opencv2/objdetect/objdetect_c.h"
#endif

743
#endif