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.
563 lines
13 KiB
563 lines
13 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 mainwindow.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 MAINWINDOW_H
|
|
#define MAINWINDOW_H
|
|
|
|
#include <QMainWindow>
|
|
#include <QFileInfo>
|
|
#include <QListWidgetItem>
|
|
#include <QSettings>
|
|
#include <QHelpEngine>
|
|
|
|
#include "imagelabel.h"
|
|
#include "timelabel.h"
|
|
#include "videotracker.h"
|
|
#include "anchoritem.h"
|
|
#include "trajectoryitem.h"
|
|
|
|
// SERIALIZATION WITH CEREAL
|
|
#include <cereal/types/string.hpp>
|
|
#include <cereal/types/map.hpp>
|
|
#include <cereal/types/utility.hpp> // for std::pair
|
|
|
|
enum class SelectionState : int {NO_SELECTION, NEW_OBJECT, CHANGE_POSITION,
|
|
SET_END_FRAME, NEW_SECTION};
|
|
|
|
namespace Ui {
|
|
class MainWindow;
|
|
}
|
|
class MainWindow : public QMainWindow
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
/**
|
|
* CEREAL serialization
|
|
*/
|
|
template<class Archive>
|
|
void serialize(Archive &archive)
|
|
{
|
|
archive(CEREAL_NVP(inputFileName), CEREAL_NVP(tracker), CEREAL_NVP(customColorsCount), cereal::make_nvp("colors", colorsMap));
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
* @param parent Parent widget
|
|
*/
|
|
explicit MainWindow(QWidget *parent = 0);
|
|
|
|
/**
|
|
* Destructor
|
|
*/
|
|
~MainWindow();
|
|
|
|
private:
|
|
/**
|
|
* Asks for saving a project before closing the application.
|
|
* @param event Event
|
|
*/
|
|
void closeEvent(QCloseEvent *event);
|
|
|
|
/**
|
|
* Connects signals and slots.
|
|
*/
|
|
void connect_signals();
|
|
|
|
/**
|
|
* Sets the GUI to a state when the end of the video was reached.
|
|
*/
|
|
void end_of_video();
|
|
|
|
/**
|
|
* When a frame is showed, slider value and time are changed. Used only as an internal function,
|
|
* that is called by other functions (show_next_frame, show_previous_frame ...) that are reading
|
|
* correct frames.
|
|
*/
|
|
void show_frame();
|
|
|
|
/**
|
|
* Sets values of Appearance forms.
|
|
*/
|
|
void set_form_values();
|
|
|
|
/**
|
|
* This is used when appearance of the object has changed. The VideoTracker needs to be informed
|
|
* to register these changes.
|
|
*/
|
|
void change_appearance();
|
|
|
|
/**
|
|
* Fills the Trajectory tab with values.
|
|
* @param id Object ID
|
|
* @param clear If true, trajectory is cleared and filled again.
|
|
* @param showProgressBar If true, shows progress bar.
|
|
*/
|
|
void set_trajectory_tab(unsigned int id, bool clear=false, bool showProgressBar=true);
|
|
|
|
/**
|
|
* Fills the Key points tab with values.
|
|
* @param id Object ID
|
|
*/
|
|
void set_anchors_tab(unsigned int id);
|
|
|
|
/**
|
|
* Fills the Appearance tab with values.
|
|
* @param id Object ID
|
|
*/
|
|
void set_appearance_tab(unsigned int id);
|
|
|
|
/**
|
|
* Restores default values of the Appearance tab.
|
|
*/
|
|
void show_appearance_tab();
|
|
|
|
/**
|
|
* Shows a frame by a given timestamp.
|
|
* @param timestamp Timestamp
|
|
*/
|
|
void show_frame_by_timestamp(int64_t timestamp);
|
|
|
|
|
|
/**
|
|
* Confirms adding a new tracked object.
|
|
* @param selectedPosition Position of the new object
|
|
*/
|
|
void new_object_confirm(Selection const &selectedPosition);
|
|
|
|
/**
|
|
* Confirms position change.
|
|
* @param selectedPosition New position
|
|
* @return True if successful
|
|
*/
|
|
bool change_position_confirm(Selection const &selectedPosition);
|
|
|
|
/**
|
|
* Confirms the last frame selection of the object
|
|
* @return True if successful
|
|
*/
|
|
bool set_end_frame_confirm();
|
|
|
|
/**
|
|
* Confirms new trajectory change (correction).
|
|
* @return True if successful
|
|
*/
|
|
bool new_section_confirm(const Selection &selectedPosition);
|
|
|
|
/**
|
|
* Disables everything apart from the video player, shows selectionWidget.
|
|
* @param state Selected option
|
|
* @param enable_selecting If true, enables selecting.
|
|
*/
|
|
void set_selection(SelectionState state, bool enable_selecting=true);
|
|
|
|
/**
|
|
* Asks a user for an object name. The new object name is stored in newObjectName.
|
|
* @param change
|
|
* @return True if name entered correctly. False if user clicked Cancel.
|
|
*/
|
|
bool enter_object_name(bool change);
|
|
|
|
/**
|
|
* Sets ui->objectsBox to display tracked objects that exist in the tracker.
|
|
* @param noTabsUpdate If true, do not change tabs according current object's index.
|
|
* This is used when an object is selected right after calling this function
|
|
* and setting tabs in this function would be useless. This saves the time
|
|
* that would be used to setting the tabs (especially the Trajectory tab
|
|
* takes a long time to be set)
|
|
*/
|
|
void show_objects_box(bool noTabsUpdate=false);
|
|
|
|
/**
|
|
* Sets the main application menu.Needs to be called AFTER enabling/disabling widget (that affect
|
|
* buttons).* It can be called only once whe changing a group of buttons, but always AFTER all
|
|
* changes are made. Sets also Window's title.
|
|
*/
|
|
void set_application_menu();
|
|
|
|
/**
|
|
* When appearance changes were made, should they be confirmed or discarded?
|
|
* @return True if changes were confirmed, discarded or if no changes were made. False if user
|
|
* pressed "Cancel" button and nothing is done with appearance changes.
|
|
*/
|
|
bool ask_save_appearance_changes();
|
|
|
|
/**
|
|
* When project is being closed, should it be saved?
|
|
* @return True if project was saved or not. False if "Cancel" button was pressed.
|
|
*/
|
|
bool ask_save_project();
|
|
|
|
/**
|
|
* Restores the initial application settings.
|
|
*/
|
|
void initial_application_settings();
|
|
|
|
/**
|
|
* Pauses the video playback.
|
|
*/
|
|
void pause();
|
|
|
|
/**
|
|
* Shows the first frame of the video.
|
|
*/
|
|
void show_first_frame();
|
|
|
|
/**
|
|
* An internal function used when changing playback speed.
|
|
*/
|
|
void speed_general();
|
|
|
|
/**
|
|
* Shows a dilog for opening a video.
|
|
* Result is stored in inputFileName
|
|
* @return False if Cancel button pressed. True otherwise.
|
|
*/
|
|
bool open_video_dialog();
|
|
|
|
/**
|
|
* Sets the application to display successfully opened video
|
|
*/
|
|
void open_video_successful();
|
|
|
|
/**
|
|
* Lets user select object color by a color picker.
|
|
*/
|
|
|
|
void custom_color();
|
|
/**
|
|
* Lets user select border object color by a color picker.
|
|
*/
|
|
void custom_border_color();
|
|
|
|
private slots:
|
|
|
|
/**
|
|
* Context menu that is displayed when clicking on an item in the Trajectory tab
|
|
* @param item Clicked item
|
|
*/
|
|
void show_anchors_menu(QListWidgetItem *item);
|
|
|
|
/**
|
|
* When an object is selected, display its settings
|
|
*/
|
|
void set_object_settings();
|
|
|
|
/**
|
|
* Slider has been pressed.
|
|
*/
|
|
void slider_pressed();
|
|
|
|
/**
|
|
* Slider has been released.
|
|
*/
|
|
void slider_released();
|
|
|
|
/**
|
|
* Shows a frame by a given time position.
|
|
* @param position Time position
|
|
*/
|
|
void show_frame_by_time(int position);
|
|
|
|
/**
|
|
* Sets playback faster.
|
|
*/
|
|
void faster();
|
|
|
|
/**
|
|
* Sets playback slower.
|
|
*/
|
|
void slower();
|
|
|
|
/**
|
|
* Shows the following frame.
|
|
*/
|
|
void show_next_frame();
|
|
|
|
/**
|
|
* Shows the previous frame.
|
|
*/
|
|
void show_previous_frame();
|
|
|
|
/**
|
|
* Plays / pauses the video.
|
|
*/
|
|
void play();
|
|
|
|
/**
|
|
* Stops the video
|
|
*/
|
|
void stop();
|
|
|
|
/**
|
|
* Opens a new video
|
|
*/
|
|
void open_video();
|
|
|
|
/**
|
|
* Allows users to create a Custom color - select it by a color picker
|
|
* @param newColorID Used for returning the ID of the created color
|
|
* @param initialColor Initial color of the picker
|
|
* @return True if a color selected. False if Cancel button pressed.
|
|
*/
|
|
bool color_picker(unsigned int &newColorID, const ObjectColor &initialColor);
|
|
|
|
/**
|
|
* Creats an output video file with tracked objects.
|
|
*/
|
|
void create_output();
|
|
|
|
/**
|
|
* Adds a new object. After receiving an object name sets UI for selecting an area
|
|
* for the TrackingAlgorithm.
|
|
*/
|
|
void add_new_object();
|
|
|
|
/**
|
|
* Sets GUI to look like before adding new object.
|
|
*/
|
|
void selection_end();
|
|
|
|
/**
|
|
* Sets a new picture when the label ui->videoLabel is resized.
|
|
*/
|
|
void reload_video_label();
|
|
|
|
/**
|
|
* Changes a shape of the object.
|
|
*/
|
|
void change_shape();
|
|
|
|
/**
|
|
* Changes a border thickness of the object.
|
|
*/
|
|
void change_border_thickness();
|
|
|
|
/**
|
|
* Changes a border color of the object.
|
|
*/
|
|
void change_border_color();
|
|
|
|
/**
|
|
* Changes a color of the object.
|
|
*/
|
|
|
|
void change_color();
|
|
|
|
/**
|
|
* Changes the object to be filled with a color.
|
|
*/
|
|
void change_draw_inside();
|
|
|
|
/**
|
|
* Changes the object so that its border is drawn.
|
|
*/
|
|
void change_draw_border();
|
|
|
|
/**
|
|
* Changes defocusing size (square size) for the object.
|
|
*/
|
|
void change_defocus_size();
|
|
|
|
/**
|
|
* Changes the object to be defocused.
|
|
*/
|
|
void change_defocus();
|
|
|
|
/**
|
|
* Discards changes to the object appearance.
|
|
*/
|
|
void discard_appearance_changes();
|
|
|
|
/**
|
|
* Confirms changes to the object appearance.
|
|
*/
|
|
void confirm_appearance_changes();
|
|
|
|
/**
|
|
* Area / video position was selected and confirmed.
|
|
* Calls responsible function; either for New object, Position change, Setting
|
|
* object's end frame or New trajectory change
|
|
*/
|
|
void selection_confirmed();
|
|
|
|
/**
|
|
* Initiates a trajectory change (correction)
|
|
*/
|
|
|
|
void add_trajectory_change();
|
|
|
|
/**
|
|
* Changes name of the object.
|
|
*/
|
|
void change_name();
|
|
|
|
/**
|
|
* Removed the object.
|
|
*/
|
|
void delete_object();
|
|
|
|
/**
|
|
* Switches the appliction to Czech.
|
|
*/
|
|
void set_czech_language();
|
|
|
|
/**
|
|
* Switches the appliction to English.
|
|
*/
|
|
void set_english_language();
|
|
|
|
/**
|
|
* Sets playback speed to its original value.
|
|
*/
|
|
void original_speed();
|
|
|
|
|
|
/**
|
|
* Sets object tracking till the end of the video.
|
|
*/
|
|
void set_video_end();
|
|
|
|
/**
|
|
* Sets frame where tracking of the object shall end.
|
|
*/
|
|
void set_end_frame();
|
|
|
|
/**
|
|
* Changes beginning of the object.
|
|
*/
|
|
void set_change_beginning();
|
|
|
|
/**
|
|
* Shows the previous frame
|
|
*/
|
|
void step_back();
|
|
|
|
/**
|
|
* Shows the following frame
|
|
*/
|
|
void step_forward();
|
|
|
|
/**
|
|
* Save the project in XML or JSON.
|
|
* @return True if successful.
|
|
*/
|
|
bool save_project();
|
|
|
|
/**
|
|
* Loads a project in XML or JSON.
|
|
*/
|
|
void load_project();
|
|
|
|
/**
|
|
* Shows a frame by a given number (index)
|
|
* @param position Number (index)
|
|
*/
|
|
void show_frame_by_number(unsigned long position);
|
|
|
|
/**
|
|
* Displays time positions.
|
|
*/
|
|
void display_time();
|
|
|
|
/**
|
|
* Displays frame numbers.
|
|
*/
|
|
void display_frame_numbers();
|
|
|
|
/**
|
|
* Sets / unsets showing the original video beside the altered one.
|
|
*/
|
|
void show_original_video();
|
|
|
|
/**
|
|
* Computes all trajectory for the object
|
|
*/
|
|
void compute_trajectory();
|
|
|
|
/**
|
|
* Shows frame of the selected trajectory item.
|
|
* @param item Selected item
|
|
*/
|
|
void trajectory_show_frame(QListWidgetItem *item);
|
|
|
|
/**
|
|
* Shows application help.
|
|
*/
|
|
void show_help();
|
|
|
|
/**
|
|
* Shows information about the application.
|
|
*/
|
|
void show_about();
|
|
|
|
private:
|
|
const QString applicationName;
|
|
Ui::MainWindow *ui;
|
|
QHelpEngine *helpEngine;
|
|
QSettings *settings;
|
|
bool displayTime; //false ~ show frame numbers
|
|
bool showOriginalVideo;
|
|
|
|
QImage frame;
|
|
QImage originalFrame;
|
|
std::unique_ptr<VideoTracker> tracker;
|
|
QTimer * timer;
|
|
unsigned int timerInterval;
|
|
int timerSpeed;
|
|
|
|
SelectionState selectionState;
|
|
QString newObjectName;
|
|
AnchorItem *editingAnchorItem; // When show_anchors_menu() called, this variable is set to know what item is being edited
|
|
|
|
bool isPlaying;
|
|
bool endOfVideo;
|
|
bool appearanceChanged;
|
|
bool projectChanged; // to ask if user wants to save it
|
|
bool settingObjectSettings;
|
|
bool isEndTimestampSet; // used with AnchorItem - determining whether to show option "Track till the end of the video"
|
|
std::string inputFileName;
|
|
|
|
// Last loaded/saved project; FileDialog starts with at this path.
|
|
QString projectFileName;
|
|
|
|
// Currently opened project to be displayed in the window's title
|
|
QString projectName;
|
|
|
|
std::map<unsigned int, std::pair<std::string, ObjectColor>> colorsMap;
|
|
unsigned int customColorsCount;
|
|
std::map<unsigned int, QString> shapesMap;
|
|
|
|
Characteristics originalObjectAppearance;
|
|
Characteristics alteredObjectAppearance;
|
|
|
|
QString computingInfoText;
|
|
QString computingInfoTitle;
|
|
|
|
};
|
|
|
|
#endif // MAINWINDOW_H
|