#! /usr/bin/env python

import sys, argparse

import storage, cvutils, utils

from numpy.linalg.linalg import inv
from numpy import loadtxt

parser = argparse.ArgumentParser(description='The program displays feature or object trajectories overlaid over the video frames.', epilog = 'Either the configuration filename or the other parameters (at least video and database filenames) need to be provided.')
parser.add_argument('--cfg', dest = 'configFilename', help = 'name of the configuration file')
parser.add_argument('-d', dest = 'databaseFilename', help = 'name of the Sqlite database file')
parser.add_argument('-i', dest = 'videoFilename', help = 'name of the video file')
parser.add_argument('-t', dest = 'trajectoryType', help = 'type of trajectories to display', choices = ['feature', 'object'], default = 'feature')
parser.add_argument('-o', dest = 'homography', help = 'name of the image to world homography')
parser.add_argument('-f', dest = 'firstFrameNum', help = 'number of first frame number to display', default = 0, type = int)

args = parser.parse_args()

if args.configFilename: # consider there is a configuration file
    params = utils.TrackingParameters()
    params.loadConfigFile(args.configFilename)
    videoFilename = params.videoFilename
    databaseFilename = params.databaseFilename
    homography = inv(params.homography)
    firstFrameNum = params.firstFrameNum
else:
    videoFilename = args.videoFilename
    databaseFilename = args.databaseFilename
    homography = None
    if args.homography:
        homography = inv(loadtxt(args.homography))            
    firstFrameNum = args.firstFrameNum

objects = storage.loadTrajectoriesFromSqlite(databaseFilename, args.trajectoryType)
cvutils.displayTrajectories(videoFilename, objects, homography, firstFrameNum)
