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