#ifndef UI_TRACKER_TRACKER_H_
#define UI_TRACKER_TRACKER_H_
#include <QMap>
#include <QGLWidget>
#include "ui/tracker/gl.h"
#include "libmv/simple_pipeline/camera_intrinsics.h"
#include "libmv/simple_pipeline/tracks.h"
#include "libmv/numeric/numeric.h"
static const double kSigma = 0.9;
static const int kHalfPatternSize = 5;
static const int kPatternSize = kHalfPatternSize * 2;
static const int kHalfSearchSize = 31;
static const int kSearchSize = kHalfSearchSize * 2;
static const int kMaxIterations = 100;
static const int kMinimumCorrelation = 0.76;
class Scene;
class Tracker : public QGLWidget {
Q_OBJECT
public:
Tracker(libmv::CameraIntrinsics* intrinsics);
void Load(QString path);
void Save(QString path);
void SetImage(int id, QImage image);
void SetUndistort(bool undistort);
void SetOverlay(Scene* scene);
void AddTrack(float x, float y);
void Track(int previous, int next, QImage old, QImage search);
void Render(int x, int y, int w, int h, int image=-1, int track=-1);
public slots:
void select(QVector<int>);
void deleteSelectedMarkers();
void deleteSelectedTracks();
void upload();
signals:
void trackChanged(QVector<int> tracks);
protected:
void paintGL();
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
private:
libmv::CameraIntrinsics* intrinsics_;
Scene* scene_;
int last_frame;
QVector< QVector<vec2> > tracks;
bool undistort_;
QImage image_;
GLTexture texture_;
mat4 transform_;
GLBuffer markers_;
int current_;
QVector<int> selected_tracks_;
vec2 delta_;
int active_track_;
bool dragged_;
};
#endif