You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
362 lines
11 KiB
362 lines
11 KiB
//------------------------------------------------------------------------------
|
|
//
|
|
// Project: Anonymizer
|
|
//
|
|
// Brno University of Technology
|
|
// Faculty of Information Technology
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
// This project was financially supported by project VG20102015006 funds
|
|
// provided by Ministry of the Interior of the Czech republic.
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
/*!
|
|
|
|
@file trackedobject.h
|
|
@brief Header file
|
|
@details Details
|
|
@authors Martin Borek (mborekcz@gmail.com)
|
|
@authors Filip Orsag (orsag@fit.vutbr.cz)
|
|
@date 2014-2015
|
|
@note This project was supported by MV CR project VG20102015006.
|
|
@copyright BUT OPEN SOURCE LICENCE (see License.txt)
|
|
|
|
*/
|
|
|
|
#ifndef TRACKEDOBJECT_H
|
|
#define TRACKEDOBJECT_H
|
|
|
|
#include "trackingalgorithm.h"
|
|
#include "videoframe.h"
|
|
|
|
#include "selection.h"
|
|
|
|
#include <QDebug>
|
|
|
|
#include <cereal/types/string.hpp>
|
|
#include <cereal/types/map.hpp>
|
|
#include <cereal/types/tuple.hpp>
|
|
|
|
#include <opencv/cv.h>
|
|
#include <opencv/cvaux.h>
|
|
#include <opencv/cxcore.h>
|
|
#include <opencv/highgui.h>
|
|
#include <opencv2/imgproc.hpp>
|
|
|
|
/**
|
|
#define VIDEOTRACKING_END_OF_VIDEO -1
|
|
#define VIDEOTRACKING_ALL_PROCESSED -1
|
|
#define VIDEOTRACKING_NOTHING_PROCESSED -2
|
|
#define VIDEOTRACKING_NO_PREVIOUS_TIMESTAMP -3 // In case other function than VideoTracker::get_next_frame() is used
|
|
*/
|
|
|
|
|
|
struct TrajectorySection
|
|
{
|
|
/**
|
|
* CEREAL serialization
|
|
*/
|
|
template<class Archive>
|
|
void serialize(Archive &archive)
|
|
{
|
|
archive(CEREAL_NVP(initialPosition), CEREAL_NVP(initialTimestamp),
|
|
CEREAL_NVP(initialTimePosition), CEREAL_NVP(initialFrameNumber));
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
TrajectorySection()
|
|
{
|
|
trackingAlgorithm = nullptr;
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
* @param initialPosition Initial object position
|
|
* @param initialTimestamp
|
|
* @param initialTimePosition
|
|
* @param initialFrameNumber
|
|
*/
|
|
TrajectorySection(Selection initialPosition, int64_t initialTimestamp,
|
|
unsigned long initialTimePosition, unsigned long initialFrameNumber) :
|
|
initialPosition(initialPosition),
|
|
initialTimestamp(initialTimestamp),
|
|
initialTimePosition(initialTimePosition),
|
|
initialFrameNumber(initialFrameNumber)
|
|
{
|
|
trackingAlgorithm = nullptr;
|
|
}
|
|
|
|
Selection initialPosition;
|
|
int64_t initialTimestamp;
|
|
unsigned long initialTimePosition;
|
|
unsigned long initialFrameNumber;
|
|
TrackingAlgorithm *trackingAlgorithm;
|
|
// bool algorithmInitialized;
|
|
};
|
|
|
|
struct TrajectoryEntry
|
|
{
|
|
/**
|
|
* CEREAL serialization
|
|
*/
|
|
template<class Archive>
|
|
void serialize(Archive &archive)
|
|
{
|
|
archive(CEREAL_NVP(position), CEREAL_NVP(timePosition), CEREAL_NVP(frameNumber));
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
TrajectoryEntry() { }
|
|
|
|
/**
|
|
* Constructor
|
|
* @param position Object position
|
|
* @param timePosition
|
|
* @param frameNumber
|
|
*/
|
|
TrajectoryEntry(Selection position, unsigned long timePosition, unsigned long frameNumber) :
|
|
position(position),
|
|
timePosition(timePosition),
|
|
frameNumber(frameNumber)
|
|
{ }
|
|
|
|
Selection position;
|
|
unsigned long timePosition;
|
|
unsigned long frameNumber;
|
|
|
|
};
|
|
|
|
class TrackedObject
|
|
{
|
|
|
|
public:
|
|
/**
|
|
* CEREAL serialization
|
|
*/
|
|
template<class Archive>
|
|
void serialize(Archive &archive)
|
|
{
|
|
archive(CEREAL_NVP(name), CEREAL_NVP(appearance), CEREAL_NVP(initialTimestamp),
|
|
CEREAL_NVP(endTimestampSet), CEREAL_NVP(endTimestamp), CEREAL_NVP(endTimePosition),
|
|
CEREAL_NVP(endFrameNumber), CEREAL_NVP(trajectorySections), CEREAL_NVP(allProcessed),
|
|
CEREAL_NVP(trajectory));
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
TrackedObject();
|
|
|
|
/**
|
|
* Constructor
|
|
* @param appearance Object appearance
|
|
* @param objectName Object name
|
|
* @param initialTimestamp Initial timestamp
|
|
* @param initialPosition Initial object position
|
|
* @param initialTimePosition Initial time position
|
|
* @param initialFrameNumber Initial frame number
|
|
* @param endTimestampSet Is end timestamp set?
|
|
* @param endTimestamp End timestamp
|
|
* @param endTimePosition End time position
|
|
* @param endFrameNumber End frame number
|
|
*/
|
|
TrackedObject(Characteristics const &appearance, std::string objectName, int64_t initialTimestamp,
|
|
Selection initialPosition, unsigned long initialTimePosition, unsigned long initialFrameNumber,
|
|
bool endTimestampSet, int64_t endTimestamp, unsigned long endTimePosition,
|
|
unsigned long endFrameNumber);
|
|
|
|
/**
|
|
* Destructor
|
|
*/
|
|
~TrackedObject();
|
|
|
|
/**
|
|
* Adds a trajectory section of the object
|
|
* @param initialTimestamp Initial timestamp of the section
|
|
* @param initialPosition Object position at the initial timestamp
|
|
* @param initialTimePosition Initial time position of the section
|
|
* @param initialFrameNumber Initial frame number of the section
|
|
*/
|
|
void add_section(int64_t initialTimestamp, Selection const &initialPosition, unsigned long initialTimePosition, unsigned long initialFrameNumber);
|
|
|
|
/**
|
|
* Sets a trajectory section of the object.
|
|
* @param newTimestamp New timestamp of the section
|
|
* @param position Object position at the first frame of the section
|
|
* @param timePosition Time position of the section
|
|
* @param frameNumber Frame number of the section
|
|
* @return True if successful
|
|
*/
|
|
bool set_trajectory_section(int64_t newTimestamp, Selection position, unsigned long timePosition, unsigned long frameNumber);
|
|
|
|
/**
|
|
* Changes a trajectory section of the object.
|
|
* @param oldTimestamp Old timestamp of the section
|
|
* @param newTimestamp New timestamp of the section
|
|
* @param position Object position at the first frame of the section
|
|
* @param timePosition Time position of the section
|
|
* @param frameNumber Frame number of the section
|
|
* @return True if successful
|
|
*/
|
|
bool change_trajectory_section(int64_t oldTimestamp, int64_t newTimestamp, Selection position, unsigned long timePosition, unsigned long frameNumber);
|
|
|
|
/**
|
|
* Changes the end frame of the object.
|
|
* @param set Set / unset last frame
|
|
* @param timestamp Timestamp of the last frame
|
|
* @param timePosition Time position of the last frame
|
|
* @param frameNumber Frame number of the last frame
|
|
* @return True if successful
|
|
*/
|
|
bool change_end_frame(bool set, int64_t timestamp=0, unsigned long timePosition=0, unsigned long frameNumber=0);
|
|
|
|
/**
|
|
* Changes appearance of the object.
|
|
* @param newAppearance New appearance of the object
|
|
*/
|
|
void change_appearance(Characteristics const &newAppearance);
|
|
|
|
/**
|
|
* Returns appearance of the object.
|
|
* @return Object appearance
|
|
*/
|
|
Characteristics get_appearance() const;
|
|
|
|
/**
|
|
* Returns position of the object at frame with given timestamp.
|
|
* @param timestamp Frame timestamp
|
|
* @param trackedPosition Returned object position
|
|
* @return False if trajectory with given timestamp does not exist, otherwise true.
|
|
*/
|
|
bool get_position(int64_t timestamp, Selection &trackedPosition) const;
|
|
|
|
/**
|
|
* Computes position of the object in the next frame.
|
|
* @param frame Next frame
|
|
* @return Tracked object position
|
|
*/
|
|
Selection track_next(VideoFrame const *frame);
|
|
|
|
/**
|
|
* Draws mark of the object in a frame.
|
|
* @param frame Frame for drawing
|
|
* @param originalFrame Original frame
|
|
* @param timestamp Timestamp of the frame
|
|
* @return True if successful
|
|
*/
|
|
bool draw_mark(cv::Mat &frame, cv::Mat const &originalFrame, int64_t timestamp) const;
|
|
|
|
/**
|
|
* Returns trajectory sections of the object.
|
|
* @return Trajectory section of the object
|
|
*/
|
|
std::map<int64_t, TrajectorySection> const &get_trajectory_sections() const;
|
|
|
|
/**
|
|
* Returns computed trajectory of the object.
|
|
* @return Trajectory of the object
|
|
*/
|
|
std::map<int64_t, TrajectoryEntry> const &get_trajectory() const;
|
|
|
|
/**
|
|
* Returns initial timestamp.
|
|
* @return initial timestamp
|
|
*/
|
|
int64_t get_initial_timestamp() const;
|
|
|
|
/**
|
|
* Returns end timestamp.
|
|
* @return End timestamp
|
|
*/
|
|
int64_t get_end_timestamp() const;
|
|
|
|
/**
|
|
* Returns end time position.
|
|
* @return End time position
|
|
*/
|
|
unsigned long get_end_time_position() const;
|
|
|
|
/**
|
|
* Returns end frame number.
|
|
* @return End frame number
|
|
*/
|
|
unsigned long get_end_frame_number() const;
|
|
|
|
/**
|
|
* Returns last processed timestamp.
|
|
* @param timestamp Returned last processed timestamp
|
|
* @return Is returned timestamp valid?
|
|
*/
|
|
bool get_last_processed_timestamp(int64_t ×tamp) const;
|
|
|
|
/**
|
|
* Sets value of the flag saying whether all trajectory is processed.
|
|
* @param processed Set / unset
|
|
*/
|
|
void set_all_processed(bool processed);
|
|
|
|
/**
|
|
* Returns whether all trajectory is processed.
|
|
* @return Is all trajectory processed?
|
|
*/
|
|
bool is_all_processed() const;
|
|
|
|
/**
|
|
* Returns whether the end timestamp is set.
|
|
* @return Is end timestamp set?
|
|
*/
|
|
bool is_end_timestamp_set() const;
|
|
|
|
/**
|
|
* Deletes a trajectory section.
|
|
* @param timestamp Trajectory section to be deleted begins at this timestamp
|
|
* @return True if successful
|
|
*/
|
|
bool delete_trajectory_section(int64_t timestamp);
|
|
|
|
/**
|
|
* Returns name of the object.
|
|
* @return Object name
|
|
*/
|
|
std::string get_name() const;
|
|
|
|
/**
|
|
* Sets name of the object.
|
|
* @param newName New object name
|
|
* @return True if successful
|
|
*/
|
|
bool set_name(std::string newName);
|
|
|
|
/**
|
|
* Erases a part of the computed trajectory. This is necessary after deserialization (with CEREAL)
|
|
* as track_next() initializes correct sections only when the trajectory's last frame is the last
|
|
* frame of the previous section.
|
|
*/
|
|
void erase_trajectory_to_comply();
|
|
|
|
private:
|
|
std::string name;
|
|
Characteristics appearance;
|
|
|
|
int64_t initialTimestamp;
|
|
bool endTimestampSet; // if FALSE -> track till the end of the video
|
|
int64_t endTimestamp;
|
|
unsigned long endTimePosition;
|
|
unsigned long endFrameNumber;
|
|
|
|
std::map<int64_t, TrajectorySection> trajectorySections;
|
|
std::map<int64_t, TrajectoryEntry> trajectory;
|
|
|
|
TrajectorySection *currentSection;
|
|
bool nextSection;
|
|
int64_t nextSectionTimestamp;
|
|
bool allProcessed;
|
|
};
|
|
|
|
#endif // TRACKEDOBJECT_H
|