/////////////////////////////////////////////////////////////////////////////
// Copyright: (C) 2008-19 Cesar Mauri Loba - CREA Software Systems
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
/////////////////////////////////////////////////////////////////////////////
#ifndef VISIONPIPELINE_H
#define VISIONPIPELINE_H
#include "crvimage.h"
#include "configbase.h"
#include "visiblenormroi.h"
#include "waittime.h"
#include "opencv2/objdetect/objdetect.hpp"
#include
class CVisionPipeline : public CConfigBase, wxThread
{
public:
CVisionPipeline (wxThreadKind kind = wxTHREAD_JOINABLE);
~CVisionPipeline();
enum ECpuUsage {
CPU_LOWEST= 0,
CPU_LOW,
CPU_NORMAL,
CPU_HIGH,
CPU_HIGHEST
};
// Thread entry point
virtual wxThread::ExitCode Entry();
virtual wxThreadError Create(unsigned int stackSize = 0);
bool ProcessImage (CIplImage& image, float& xVel, float& yVel);
bool GetTrackFace () const { return m_trackFace; }
void SetTrackFace (bool state) { m_trackFace= state; }
bool GetEnableWhenFaceDetected () const { return m_enableWhenFaceDetected; }
void SetEnableWhenFaceDetected (bool state) { m_enableWhenFaceDetected= state; }
bool IsFaceDetected () const;
unsigned int GetTimeout () const { return (unsigned int) (m_waitTime.GetWaitTimeMs()/1000); }
void SetTimeout (unsigned int timeout) { m_waitTime.SetWaitTimeMs(timeout*1000); }
void SetDegradation (int value) { m_trackArea.SetDegradation(value); }
int GetCpuUsage ();
void SetCpuUsage (int value);
bool IsTrackFaceAllowed () { return (!m_faceCascade.empty()); }
CVisibleNormROI* GetTrackAreaControl () { return &m_trackArea; }
// Configuration methods
virtual void InitDefaults();
virtual void WriteProfileData(wxConfigBase* pConfObj);
virtual void ReadProfileData(wxConfigBase* pConfObj);
private:
CVisibleNormROI m_trackArea;
bool m_trackFace;
bool m_enableWhenFaceDetected;
bool m_isRunning;
CWaitTime m_waitTime;
CWaitTime m_trackAreaTimeout;
CIplImage m_imgThread;
CIplImage m_imgPrev, m_imgCurr;
cv::CascadeClassifier m_faceCascade;
int m_threadPeriod;
wxCriticalSection m_imageCopyMutex;
wxMutex m_mutex;
wxCondition m_condition;
// Face location detection
cv::Rect m_faceLocation;
int m_faceLocationStatus; // 0 -> not available, 1 -> available
enum { NUM_CORNERS = 20 };
std::vector m_corners;
void AllocWorkingSpace (CIplImage &image);
int PreprocessImage ();
void ComputeFaceTrackArea (CIplImage &image);
void SetThreadPeriod (int value);
void NewTracker(CIplImage &image, float &xVel, float &yVel);
};
#endif