mirror of https://github.com/opencv/opencv.git
put the detection-based tracker back (to objdetect module), so that the Android face detection sample builds fine. The patch by Konstantin Matskevich that adds C++11 threads support has been merged in too. Also, fixed compile error in the doc builder.
parent
3858f2291d
commit
07c0d50edf
6 changed files with 1369 additions and 2 deletions
@ -0,0 +1,218 @@ |
||||
/*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.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
|
||||
// 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*/
|
||||
|
||||
#ifndef __OPENCV_OBJDETECT_DBT_HPP__ |
||||
#define __OPENCV_OBJDETECT_DBT_HPP__ |
||||
|
||||
#if defined(__linux__) || defined(LINUX) || defined(__APPLE__) || defined(__ANDROID__) || \ |
||||
(defined(__cplusplus) && __cplusplus > 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1700) |
||||
|
||||
#include <vector> |
||||
|
||||
namespace cv |
||||
{ |
||||
class CV_EXPORTS DetectionBasedTracker |
||||
{ |
||||
public: |
||||
struct Parameters |
||||
{ |
||||
int maxTrackLifetime; |
||||
int minDetectionPeriod; //the minimal time between run of the big object detector (on the whole frame) in ms (1000 mean 1 sec), default=0
|
||||
|
||||
Parameters(); |
||||
}; |
||||
|
||||
class IDetector |
||||
{ |
||||
public: |
||||
IDetector(): |
||||
minObjSize(96, 96), |
||||
maxObjSize(INT_MAX, INT_MAX), |
||||
minNeighbours(2), |
||||
scaleFactor(1.1f) |
||||
{} |
||||
|
||||
virtual void detect(const cv::Mat& image, std::vector<cv::Rect>& objects) = 0; |
||||
|
||||
void setMinObjectSize(const cv::Size& min) |
||||
{ |
||||
minObjSize = min; |
||||
} |
||||
void setMaxObjectSize(const cv::Size& max) |
||||
{ |
||||
maxObjSize = max; |
||||
} |
||||
cv::Size getMinObjectSize() const |
||||
{ |
||||
return minObjSize; |
||||
} |
||||
cv::Size getMaxObjectSize() const |
||||
{ |
||||
return maxObjSize; |
||||
} |
||||
float getScaleFactor() |
||||
{ |
||||
return scaleFactor; |
||||
} |
||||
void setScaleFactor(float value) |
||||
{ |
||||
scaleFactor = value; |
||||
} |
||||
int getMinNeighbours() |
||||
{ |
||||
return minNeighbours; |
||||
} |
||||
void setMinNeighbours(int value) |
||||
{ |
||||
minNeighbours = value; |
||||
} |
||||
virtual ~IDetector() {} |
||||
|
||||
protected: |
||||
cv::Size minObjSize; |
||||
cv::Size maxObjSize; |
||||
int minNeighbours; |
||||
float scaleFactor; |
||||
}; |
||||
|
||||
DetectionBasedTracker(cv::Ptr<IDetector> mainDetector, cv::Ptr<IDetector> trackingDetector, const Parameters& params); |
||||
virtual ~DetectionBasedTracker(); |
||||
|
||||
virtual bool run(); |
||||
virtual void stop(); |
||||
virtual void resetTracking(); |
||||
|
||||
virtual void process(const cv::Mat& imageGray); |
||||
|
||||
bool setParameters(const Parameters& params); |
||||
const Parameters& getParameters() const; |
||||
|
||||
|
||||
typedef std::pair<cv::Rect, int> Object; |
||||
virtual void getObjects(std::vector<cv::Rect>& result) const; |
||||
virtual void getObjects(std::vector<Object>& result) const; |
||||
|
||||
enum ObjectStatus |
||||
{ |
||||
DETECTED_NOT_SHOWN_YET, |
||||
DETECTED, |
||||
DETECTED_TEMPORARY_LOST, |
||||
WRONG_OBJECT |
||||
}; |
||||
struct ExtObject |
||||
{ |
||||
int id; |
||||
cv::Rect location; |
||||
ObjectStatus status; |
||||
ExtObject(int _id, cv::Rect _location, ObjectStatus _status) |
||||
:id(_id), location(_location), status(_status) |
||||
{ |
||||
} |
||||
}; |
||||
virtual void getObjects(std::vector<ExtObject>& result) const; |
||||
|
||||
|
||||
virtual int addObject(const cv::Rect& location); //returns id of the new object
|
||||
|
||||
protected: |
||||
class SeparateDetectionWork; |
||||
cv::Ptr<SeparateDetectionWork> separateDetectionWork; |
||||
friend void* workcycleObjectDetectorFunction(void* p); |
||||
|
||||
struct InnerParameters |
||||
{ |
||||
int numLastPositionsToTrack; |
||||
int numStepsToWaitBeforeFirstShow; |
||||
int numStepsToTrackWithoutDetectingIfObjectHasNotBeenShown; |
||||
int numStepsToShowWithoutDetecting; |
||||
|
||||
float coeffTrackingWindowSize; |
||||
float coeffObjectSizeToTrack; |
||||
float coeffObjectSpeedUsingInPrediction; |
||||
|
||||
InnerParameters(); |
||||
}; |
||||
Parameters parameters; |
||||
InnerParameters innerParameters; |
||||
|
||||
struct TrackedObject |
||||
{ |
||||
typedef std::vector<cv::Rect> PositionsVector; |
||||
|
||||
PositionsVector lastPositions; |
||||
|
||||
int numDetectedFrames; |
||||
int numFramesNotDetected; |
||||
int id; |
||||
|
||||
TrackedObject(const cv::Rect& rect):numDetectedFrames(1), numFramesNotDetected(0) |
||||
{ |
||||
lastPositions.push_back(rect); |
||||
id=getNextId(); |
||||
}; |
||||
|
||||
static int getNextId() |
||||
{ |
||||
static int _id=0; |
||||
return _id++; |
||||
} |
||||
}; |
||||
|
||||
int numTrackedSteps; |
||||
std::vector<TrackedObject> trackedObjects; |
||||
|
||||
std::vector<float> weightsPositionsSmoothing; |
||||
std::vector<float> weightsSizesSmoothing; |
||||
|
||||
cv::Ptr<IDetector> cascadeForTracking; |
||||
|
||||
void updateTrackedObjects(const std::vector<cv::Rect>& detectedObjects); |
||||
cv::Rect calcTrackedObjectPositionToShow(int i) const; |
||||
cv::Rect calcTrackedObjectPositionToShow(int i, ObjectStatus& status) const; |
||||
void detectInRegion(const cv::Mat& img, const cv::Rect& r, std::vector<cv::Rect>& detectedObjectsInRegions); |
||||
}; |
||||
} //end of cv namespace
|
||||
#endif |
||||
|
||||
#endif |
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,104 @@ |
||||
#if defined(__linux__) || defined(LINUX) || defined(__APPLE__) || defined(ANDROID) |
||||
|
||||
#include <opencv2/imgproc/imgproc.hpp> // Gaussian Blur |
||||
#include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat, Scalar) |
||||
#include <opencv2/highgui/highgui.hpp> // OpenCV window I/O |
||||
#include <opencv2/features2d/features2d.hpp> |
||||
#include <opencv2/objdetect/objdetect.hpp> |
||||
|
||||
#include <stdio.h> |
||||
#include <string> |
||||
#include <vector> |
||||
|
||||
using namespace std; |
||||
using namespace cv; |
||||
|
||||
const string WindowName = "Face Detection example"; |
||||
|
||||
class CascadeDetectorAdapter: public DetectionBasedTracker::IDetector |
||||
{ |
||||
public: |
||||
CascadeDetectorAdapter(cv::Ptr<cv::CascadeClassifier> detector): |
||||
IDetector(), |
||||
Detector(detector) |
||||
{ |
||||
CV_Assert(detector); |
||||
} |
||||
|
||||
void detect(const cv::Mat &Image, std::vector<cv::Rect> &objects) |
||||
{ |
||||
Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize); |
||||
} |
||||
|
||||
virtual ~CascadeDetectorAdapter() |
||||
{} |
||||
|
||||
private: |
||||
CascadeDetectorAdapter(); |
||||
cv::Ptr<cv::CascadeClassifier> Detector; |
||||
}; |
||||
|
||||
int main(int , char** ) |
||||
{ |
||||
namedWindow(WindowName); |
||||
|
||||
VideoCapture VideoStream(0); |
||||
|
||||
if (!VideoStream.isOpened()) |
||||
{ |
||||
printf("Error: Cannot open video stream from camera\n"); |
||||
return 1; |
||||
} |
||||
|
||||
std::string cascadeFrontalfilename = "../../data/lbpcascades/lbpcascade_frontalface.xml"; |
||||
cv::Ptr<cv::CascadeClassifier> cascade = makePtr<cv::CascadeClassifier>(cascadeFrontalfilename); |
||||
cv::Ptr<DetectionBasedTracker::IDetector> MainDetector = makePtr<CascadeDetectorAdapter>(cascade); |
||||
|
||||
cascade = makePtr<cv::CascadeClassifier>(cascadeFrontalfilename); |
||||
cv::Ptr<DetectionBasedTracker::IDetector> TrackingDetector = makePtr<CascadeDetectorAdapter>(cascade); |
||||
|
||||
DetectionBasedTracker::Parameters params; |
||||
DetectionBasedTracker Detector(MainDetector, TrackingDetector, params); |
||||
|
||||
if (!Detector.run()) |
||||
{ |
||||
printf("Error: Detector initialization failed\n"); |
||||
return 2; |
||||
} |
||||
|
||||
Mat ReferenceFrame; |
||||
Mat GrayFrame; |
||||
vector<Rect> Faces; |
||||
|
||||
while(true) |
||||
{ |
||||
VideoStream >> ReferenceFrame; |
||||
cvtColor(ReferenceFrame, GrayFrame, COLOR_RGB2GRAY); |
||||
Detector.process(GrayFrame); |
||||
Detector.getObjects(Faces); |
||||
|
||||
for (size_t i = 0; i < Faces.size(); i++) |
||||
{ |
||||
rectangle(ReferenceFrame, Faces[i], Scalar(0,255,0)); |
||||
} |
||||
|
||||
imshow(WindowName, ReferenceFrame); |
||||
|
||||
if (waitKey(30) >= 0) break; |
||||
} |
||||
|
||||
Detector.stop(); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
#else |
||||
|
||||
#include <stdio.h> |
||||
int main() |
||||
{ |
||||
printf("This sample works for UNIX or ANDROID only\n"); |
||||
return 0; |
||||
} |
||||
|
||||
#endif |
Loading…
Reference in new issue