@ -42,6 +42,7 @@
//M*/
# include "precomp.hpp"
# include <cassert>
# if (defined(__cplusplus) && __cplusplus > 199711L) || (defined(_MSC_VER) && _MSC_VER >= 1700)
# define USE_STD_THREADS
@ -124,7 +125,8 @@ namespace cv
class cv : : DetectionBasedTracker : : SeparateDetectionWork
{
public :
SeparateDetectionWork ( cv : : DetectionBasedTracker & _detectionBasedTracker , cv : : Ptr < DetectionBasedTracker : : IDetector > _detector ) ;
SeparateDetectionWork ( cv : : DetectionBasedTracker & _detectionBasedTracker , cv : : Ptr < DetectionBasedTracker : : IDetector > _detector ,
const cv : : DetectionBasedTracker : : Parameters & params ) ;
virtual ~ SeparateDetectionWork ( ) ;
bool communicateWithDetectingThread ( const Mat & imageGray , std : : vector < Rect > & rectsWhereRegions ) ;
bool run ( ) ;
@ -135,23 +137,36 @@ class cv::DetectionBasedTracker::SeparateDetectionWork
{
return ( stateThread = = STATE_THREAD_WORKING_SLEEPING ) | | ( stateThread = = STATE_THREAD_WORKING_WITH_IMAGE ) ;
}
inline void lock ( )
void setParameters ( const cv : : DetectionBasedTracker : : Parameters & params )
{
# ifdef USE_STD_THREADS
mtx_lock . lock ( ) ;
std : : unique_lock < std : : mutex > mtx_lock ( mtx ) ;
# else
pthread_mutex_lock ( & mutex ) ;
# endif
parameters = params ;
# ifndef USE_STD_THREADS
pthread_mutex_unlock ( & mutex ) ;
# endif
}
inline void unlock ( )
inline void init ( )
{
# ifdef USE_STD_THREADS
mtx_lock . unlock ( ) ;
std : : unique_lock < std : : mutex > mtx_lock ( mtx ) ;
# else
pthread_mutex_lock ( & mutex ) ;
# endif
stateThread = STATE_THREAD_STOPPED ;
isObjectDetectingReady = false ;
shouldObjectDetectingResultsBeForgot = false ;
# ifdef USE_STD_THREADS
objectDetectorThreadStartStop . notify_one ( ) ;
# else
pthread_cond_signal ( & ( objectDetectorThreadStartStop ) ) ;
pthread_mutex_unlock ( & mutex ) ;
# endif
}
protected :
DetectionBasedTracker & detectionBasedTracker ;
@ -159,7 +174,6 @@ class cv::DetectionBasedTracker::SeparateDetectionWork
# ifdef USE_STD_THREADS
std : : thread second_workthread ;
std : : mutex mtx ;
std : : unique_lock < std : : mutex > mtx_lock ;
std : : condition_variable objectDetectorRun ;
std : : condition_variable objectDetectorThreadStartStop ;
# else
@ -187,23 +201,23 @@ class cv::DetectionBasedTracker::SeparateDetectionWork
friend void * workcycleObjectDetectorFunction ( void * p ) ;
long long timeWhenDetectingThreadStartedWork ;
cv : : DetectionBasedTracker : : Parameters parameters ;
} ;
cv : : DetectionBasedTracker : : SeparateDetectionWork : : SeparateDetectionWork ( DetectionBasedTracker & _detectionBasedTracker , cv : : Ptr < DetectionBasedTracker : : IDetector > _detector )
cv : : DetectionBasedTracker : : SeparateDetectionWork : : SeparateDetectionWork ( DetectionBasedTracker & _detectionBasedTracker , cv : : Ptr < DetectionBasedTracker : : IDetector > _detector ,
const cv : : DetectionBasedTracker : : Parameters & params )
: detectionBasedTracker ( _detectionBasedTracker ) ,
cascadeInThread ( ) ,
isObjectDetectingReady ( false ) ,
shouldObjectDetectingResultsBeForgot ( false ) ,
stateThread ( STATE_THREAD_STOPPED ) ,
timeWhenDetectingThreadStartedWork ( - 1 )
timeWhenDetectingThreadStartedWork ( - 1 ) ,
parameters ( params )
{
CV_Assert ( _detector ) ;
cascadeInThread = _detector ;
# ifdef USE_STD_THREADS
mtx_lock = std : : unique_lock < std : : mutex > ( mtx ) ;
mtx_lock . unlock ( ) ;
# else
# ifndef USE_STD_THREADS
int res = 0 ;
res = pthread_mutex_init ( & mutex , NULL ) ; //TODO: should be attributes?
if ( res ) {
@ -235,21 +249,22 @@ cv::DetectionBasedTracker::SeparateDetectionWork::~SeparateDetectionWork()
pthread_cond_destroy ( & objectDetectorThreadStartStop ) ;
pthread_cond_destroy ( & objectDetectorRun ) ;
pthread_mutex_destroy ( & mutex ) ;
# else
second_workthread . join ( ) ;
# endif
}
bool cv : : DetectionBasedTracker : : SeparateDetectionWork : : run ( )
{
LOGD ( " DetectionBasedTracker::SeparateDetectionWork::run() --- start " ) ;
# ifdef USE_STD_THREADS
mtx_lock . lock ( ) ;
std : : unique_lock < std : : mutex > mtx_lock ( mtx ) ;
// unlocked when leaving scope
# else
pthread_mutex_lock ( & mutex ) ;
# endif
if ( stateThread ! = STATE_THREAD_STOPPED ) {
LOGE ( " DetectionBasedTracker::SeparateDetectionWork::run is called while the previous run is not stopped " ) ;
# ifdef USE_STD_THREADS
mtx_lock . unlock ( ) ;
# else
# ifndef USE_STD_THREADS
pthread_mutex_unlock ( & mutex ) ;
# endif
return false ;
@ -258,7 +273,6 @@ bool cv::DetectionBasedTracker::SeparateDetectionWork::run()
# ifdef USE_STD_THREADS
second_workthread = std : : thread ( workcycleObjectDetectorFunction , ( void * ) this ) ; //TODO: add attributes?
objectDetectorThreadStartStop . wait ( mtx_lock ) ;
mtx_lock . unlock ( ) ;
# else
pthread_create ( & second_workthread , NULL , workcycleObjectDetectorFunction , ( void * ) this ) ; //TODO: add attributes?
pthread_cond_wait ( & objectDetectorThreadStartStop , & mutex ) ;
@ -284,16 +298,7 @@ void* cv::workcycleObjectDetectorFunction(void* p)
{
CATCH_ALL_AND_LOG ( { ( ( cv : : DetectionBasedTracker : : SeparateDetectionWork * ) p ) - > workcycleObjectDetector ( ) ; } ) ;
try {
( ( cv : : DetectionBasedTracker : : SeparateDetectionWork * ) p ) - > lock ( ) ;
( ( cv : : DetectionBasedTracker : : SeparateDetectionWork * ) p ) - > stateThread = cv : : DetectionBasedTracker : : SeparateDetectionWork : : STATE_THREAD_STOPPED ;
( ( cv : : DetectionBasedTracker : : SeparateDetectionWork * ) p ) - > isObjectDetectingReady = false ;
( ( cv : : DetectionBasedTracker : : SeparateDetectionWork * ) p ) - > shouldObjectDetectingResultsBeForgot = false ;
# ifdef USE_STD_THREADS
( ( cv : : DetectionBasedTracker : : SeparateDetectionWork * ) p ) - > objectDetectorThreadStartStop . notify_one ( ) ;
# else
pthread_cond_signal ( & ( ( ( cv : : DetectionBasedTracker : : SeparateDetectionWork * ) p ) - > objectDetectorThreadStartStop ) ) ;
# endif
( ( cv : : DetectionBasedTracker : : SeparateDetectionWork * ) p ) - > unlock ( ) ;
( ( cv : : DetectionBasedTracker : : SeparateDetectionWork * ) p ) - > init ( ) ;
} catch ( . . . ) {
LOGE0 ( " DetectionBasedTracker: workcycleObjectDetectorFunction: ERROR concerning pointer, received as the function parameter " ) ;
}
@ -308,7 +313,7 @@ void cv::DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector()
CV_Assert ( stateThread = = STATE_THREAD_WORKING_SLEEPING ) ;
# ifdef USE_STD_THREADS
mtx_lock . lock ( ) ;
std : : unique_lock < std : : mutex > mtx_lock ( mtx ) ;
# else
pthread_mutex_lock ( & mutex ) ;
# endif
@ -453,7 +458,7 @@ void cv::DetectionBasedTracker::SeparateDetectionWork::stop()
{
//FIXME: TODO: should add quickStop functionality
# ifdef USE_STD_THREADS
mtx_lock . lock ( ) ;
std : : unique_lock < std : : mutex > mtx_lock ( mtx ) ;
# else
pthread_mutex_lock ( & mutex ) ;
# endif
@ -464,6 +469,7 @@ void cv::DetectionBasedTracker::SeparateDetectionWork::stop()
pthread_mutex_unlock ( & mutex ) ;
# endif
LOGE ( " SimpleHighguiDemoCore::stop is called but the SimpleHighguiDemoCore pthread is not active " ) ;
stateThread = STATE_THREAD_STOPPING ;
return ;
}
stateThread = STATE_THREAD_STOPPING ;
@ -485,7 +491,7 @@ void cv::DetectionBasedTracker::SeparateDetectionWork::resetTracking()
{
LOGD ( " DetectionBasedTracker::SeparateDetectionWork::resetTracking " ) ;
# ifdef USE_STD_THREADS
mtx_lock . lock ( ) ;
std : : unique_lock < std : : mutex > mtx_lock ( mtx ) ;
# else
pthread_mutex_lock ( & mutex ) ;
# endif
@ -523,7 +529,7 @@ bool cv::DetectionBasedTracker::SeparateDetectionWork::communicateWithDetectingT
bool shouldHandleResult = false ;
# ifdef USE_STD_THREADS
mtx_lock . lock ( ) ;
std : : unique_lock < std : : mutex > mtx_lock ( mtx ) ;
# else
pthread_mutex_lock ( & mutex ) ;
# endif
@ -574,8 +580,8 @@ bool cv::DetectionBasedTracker::SeparateDetectionWork::communicateWithDetectingT
cv : : DetectionBasedTracker : : Parameters : : Parameters ( )
{
maxTrackLifetime = 5 ;
minDetectionPeriod = 0 ;
maxTrackLifetime = 5 ;
minDetectionPeriod = 0 ;
}
cv : : DetectionBasedTracker : : InnerParameters : : InnerParameters ( )
@ -603,7 +609,7 @@ cv::DetectionBasedTracker::DetectionBasedTracker(cv::Ptr<IDetector> mainDetector
& & trackingDetector ) ;
if ( mainDetector ) {
separateDetectionWork . reset ( new SeparateDetectionWork ( * this , mainDetector ) ) ;
separateDetectionWork . reset ( new SeparateDetectionWork ( * this , mainDetector , params ) ) ;
}
weightsPositionsSmoothing . push_back ( 1 ) ;
@ -1016,12 +1022,9 @@ bool cv::DetectionBasedTracker::setParameters(const Parameters& params)
}
if ( separateDetectionWork ) {
separateDetectionWork - > lock ( ) ;
separateDetectionWork - > setParameters ( params ) ;
}
parameters = params ;
if ( separateDetectionWork ) {
separateDetectionWork - > unlock ( ) ;
}
return true ;
}