Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ControllerTrackingAlgorithm.cpp 3.17 KiB
#include "ControllerTrackingAlgorithm.h"
#include "ControllerTrackedComponent.h"

#include "../Model/TrackerParameter.h"
#include "../View/TrackerParameterView.h"
#include "../View/TrackedElementView.h"

ControllerTrackingAlgorithm::ControllerTrackingAlgorithm(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) :
    IController(parent, context, ctr)
{
	m_BioTrackerContext = context;
}

void ControllerTrackingAlgorithm::connectControllerToController()
{
	IController * ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COMPONENT);
	QPointer< ControllerTrackedComponent > ctrComponent = qobject_cast<ControllerTrackedComponent *>(ctr);

	m_TrackedTrajectoryMajor = ctrComponent->getModel();
}

void ControllerTrackingAlgorithm::doTracking(std::shared_ptr<cv::Mat> mat, uint number)
{
    qobject_cast<BioTrackerTrackingAlgorithm *>(m_Model)->doTracking(mat, number);
}

IView *ControllerTrackingAlgorithm::getTrackingParameterWidget()
{
    return m_View;
}

void ControllerTrackingAlgorithm::createModel()
{
	connectControllerToController();

	m_TrackingParameter = new TrackerParameter(this);

	m_Model = new BioTrackerTrackingAlgorithm(this, m_TrackingParameter, m_TrackedTrajectoryMajor);
}

void ControllerTrackingAlgorithm::createView()
{
    m_View = new TrackerParameterView(0, this, m_TrackingParameter);
}

void ControllerTrackingAlgorithm::connectModelToController()
{
    BioTrackerTrackingAlgorithm *trackingAlg = qobject_cast<BioTrackerTrackingAlgorithm *>(m_Model);
    QObject::connect(trackingAlg, &BioTrackerTrackingAlgorithm::emitCvMatA, this, &ControllerTrackingAlgorithm::receiveCvMatFromTrackingAlgorithm);
    QObject::connect(trackingAlg, &BioTrackerTrackingAlgorithm::emitTrackingDone, this, &ControllerTrackingAlgorithm::receiveTrackingDone);
	QObject::connect(trackingAlg, &BioTrackerTrackingAlgorithm::emitChangeDisplayImage, this, &ControllerTrackingAlgorithm::receiveChangeDisplayImage);
	QObject::connect(this, &ControllerTrackingAlgorithm::emitAreaDescriptorUpdate, trackingAlg, &BioTrackerTrackingAlgorithm::receiveAreaDescriptorUpdate);

    QObject::connect(static_cast<TrackerParameterView*>(m_View), &TrackerParameterView::parametersChanged, 
        trackingAlg, &BioTrackerTrackingAlgorithm::receiveParametersChanged);

	//enable the tracker to send video dimension updates to the views via signal
	IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COMPONENT);
	IView *v = qobject_cast<ControllerTrackedComponent*>(ctr)->getView();
	TrackedElementView *v2 = dynamic_cast<TrackedElementView *>(v);
	QObject::connect(trackingAlg, SIGNAL(emitDimensionUpdate(int, int)), v2, SLOT(rcvDimensionUpdate(int, int)));
}

void ControllerTrackingAlgorithm::receiveCvMatFromTrackingAlgorithm(std::shared_ptr<cv::Mat> mat, QString name)
{
    Q_EMIT emitCvMat(mat, name);
}

void ControllerTrackingAlgorithm::receiveTrackingDone(uint framenumber)
{
    Q_EMIT emitTrackingDone(framenumber);
}

void ControllerTrackingAlgorithm::receiveChangeDisplayImage(QString str) {
	Q_EMIT emitChangeDisplayImage(str);
}

void ControllerTrackingAlgorithm::receiveAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr) {
	Q_EMIT emitAreaDescriptorUpdate(areaDescr);
}