# HG changeset patch # User Nicolas Saunier # Date 1527887971 14400 # Node ID 75af46516b2b65af94c7c50df4c10baaa2ed47e4 # Parent 6c5ce3ec497edc8470851f1fcecc75acf3943200 work in progress diff -r 6c5ce3ec497e -r 75af46516b2b python/cvutils.py --- a/python/cvutils.py Fri Jun 01 17:19:24 2018 -0400 +++ b/python/cvutils.py Fri Jun 01 17:19:31 2018 -0400 @@ -18,7 +18,7 @@ from sys import stdout from os import listdir -from copy import deepcopy +from subprocess import check_call from math import floor, log10, ceil from numpy import dot, array, append, float32, loadtxt, savetxt, append, zeros, ones, identity, abs as npabs, logical_and, unravel_index, sum as npsum, isnan, mgrid, median, floor as npfloor, ceil as npceil @@ -27,10 +27,9 @@ from matplotlib.pyplot import imread, imsave videoFilenameExtensions = ['mov', 'avi', 'mp4', 'MOV', 'AVI', 'MP4'] - +trackerExe = 'feature-based-tracking' #importaggdraw # agg on top of PIL (antialiased drawing) - cvRed = {'default': (0,0,255), 'colorblind': (0,114,178)} cvGreen = {'default': (0,255,0), @@ -283,6 +282,36 @@ else: return None + def tracking(configFilename, grouping, videoFilename = None, dbFilename = None, homographyFilename = None, maskFilename = None, undistort = False, intrinsicCameraMatrix = None, distortionCoefficients = None): + '''Runs the tracker in a subprocess + if grouping is True, it is feature grouping + otherwise it is feature tracking''' + if grouping: + trackingMode = '--gf' + else: + trackingMode = '--tf' + cmd = [trackerExe, configFilename, trackingMode] + + if videoFilename is not None: + cmd += ['--video-filename', videoFilename] + if dbFilename is not None: + cmd += ['--database-filename', dbFilename] + if homographyFilename is not None: + cmd += ['--homography-filename', homographyFilename] + if maskFilename is not None: + cmd += ['--mask-filename', maskFilename] + if undistort: + cmd += ['--undistort', 'true'] + if intrinsicCameraMatrix is not None: # we currently have to save a file + pass#from time import time + #savetxt + #cmd += [] + if distortionCoefficients is not None: + cmd += ['--distortion-coefficients', ' '.join([str(x) for x in distortionCoefficients])] + + #check_call([trackerExe, configFilename, trackingMode]) # , stderr = out, shell = True + print(cmd) # , stderr = out, shell = True + def displayTrajectories(videoFilename, objects, boundingBoxes = {}, homography = None, firstFrameNum = 0, lastFrameNumArg = None, printFrames = True, rescale = 1., nFramesStep = 1, saveAllImages = False, nZerosFilenameArg = None, undistort = False, intrinsicCameraMatrix = None, distortionCoefficients = None, undistortedImageMultiplication = 1., annotations = [], gtMatches = {}, toMatches = {}, colorBlind = False): '''Displays the objects overlaid frame by frame over the video ''' if colorBlind: diff -r 6c5ce3ec497e -r 75af46516b2b python/moving.py --- a/python/moving.py Fri Jun 01 17:19:24 2018 -0400 +++ b/python/moving.py Fri Jun 01 17:19:31 2018 -0400 @@ -1184,7 +1184,6 @@ newObject = MovingObject(newNum, emptyInterval, positions, velocities, userType = obj1.getUserType()) return MovingObject.concatenate(MovingObject.concatenate(obj1, newObject),obj2) - else: newTimeInterval = TimeInterval.union(obj1.getTimeInterval(), obj2.getTimeInterval()) # positions diff -r 6c5ce3ec497e -r 75af46516b2b python/storage.py --- a/python/storage.py Fri Jun 01 17:19:24 2018 -0400 +++ b/python/storage.py Fri Jun 01 17:19:31 2018 -0400 @@ -5,7 +5,7 @@ import utils, moving, events, indicators, shutil from base import VideoFilenameAddable -from os import path +from pathlib import Path from copy import copy import sqlite3, logging from numpy import log, min as npmin, max as npmax, round as npround, array, sum as npsum, loadtxt, floor as npfloor, ceil as npceil, linalg @@ -43,7 +43,7 @@ def deleteFromSqlite(filename, dataType): 'Deletes (drops) some tables in the filename depending on type of data' - if path.isfile(filename): + if Path(filename).is_file(): with sqlite3.connect(filename) as connection: if dataType == 'object': dropTables(connection, ['objects', 'objects_features']) @@ -1307,7 +1307,7 @@ self.stdVehicleSpeed = config.getfloat(self.sectionHeader, 'std-veh-speed') def __init__(self, filename = None): - if filename is not None and path.exists(filename): + if filename is not None and Path(filename).exists(): self.loadConfigFile(filename) else: print('Configuration filename {} could not be loaded.'.format(filename)) @@ -1350,12 +1350,12 @@ self.videoFilename = config.get(self.sectionHeader, 'video-filename') self.databaseFilename = config.get(self.sectionHeader, 'database-filename') self.homographyFilename = config.get(self.sectionHeader, 'homography-filename') - if path.exists(self.homographyFilename): + if Path(self.homographyFilename).exists(): self.homography = loadtxt(self.homographyFilename) else: self.homography = None self.intrinsicCameraFilename = config.get(self.sectionHeader, 'intrinsic-camera-filename') - if path.exists(self.intrinsicCameraFilename): + if Path(self.intrinsicCameraFilename).exists(): self.intrinsicCameraMatrix = loadtxt(self.intrinsicCameraFilename) else: self.intrinsicCameraMatrix = None @@ -1389,7 +1389,7 @@ self.minLcssSimilarity = config.getfloat(self.sectionHeader, 'min-lcss-similarity') def __init__(self, filename = None): - if filename is not None and path.exists(filename): + if filename is not None and Path(filename).exists(): self.loadConfigFile(filename) else: print('Configuration filename {} could not be loaded.'.format(filename)) diff -r 6c5ce3ec497e -r 75af46516b2b scripts/process.py --- a/scripts/process.py Fri Jun 01 17:19:24 2018 -0400 +++ b/scripts/process.py Fri Jun 01 17:19:31 2018 -0400 @@ -1,7 +1,7 @@ #! /usr/bin/env python3 import sys, argparse -from pathlib2 import Path +from pathlib import Path import matplotlib matplotlib.use('Agg') @@ -14,11 +14,14 @@ parser = argparse.ArgumentParser(description='This program manages the processing of several files based on a description of the sites and video data in an SQLite database following the metadata module.') parser.add_argument('--db', dest = 'metadataFilename', help = 'name of the metadata file', required = True) parser.add_argument('--videos', dest = 'videoIds', help = 'indices of the video sequences', nargs = '*', type = int) +parser.add_argument('--cfg', dest = 'configFilename', help = 'name of the configuration file') parser.add_argument('-n', dest = 'nObjects', help = 'number of objects/interactions to process', type = int) parser.add_argument('--prediction-method', dest = 'predictionMethod', help = 'prediction method (constant velocity (cvd: vector computation (approximate); cve: equation solving; cv: discrete time (approximate)), normal adaptation, point set prediction)', choices = ['cvd', 'cve', 'cv', 'na', 'ps', 'mp']) parser.add_argument('--pet', dest = 'computePET', help = 'computes PET', action = 'store_true') +# override other tracking config, erase sqlite? parser.add_argument('--delete', dest = 'delete', help = 'data to delete', choices = ['feature', 'object', 'classification', 'interaction']) parser.add_argument('--process', dest = 'process', help = 'data to process', choices = ['feature', 'object', 'classification', 'interaction']) +parser.add_argument('--display', dest = 'display', help = 'data to display (replay over video)', choices = ['feature', 'object', 'classification', 'interaction']) parser.add_argument('--analyze', dest = 'analyze', help = 'data to analyze (results)', choices = ['feature', 'object', 'classification', 'interaction']) # need way of selecting sites as similar as possible to sql alchemy syntax @@ -26,6 +29,8 @@ # manage cfg files, overwrite them (or a subset of parameters) # delete sqlite files +# info of metadata + parser.add_argument('--nthreads', dest = 'nProcesses', help = 'number of processes to run in parallel', type = int, default = 1) args = parser.parse_args() @@ -41,7 +46,16 @@ vs = session.query(VideoSequence).get(videoId) storage.deleteFromSqlite(str(parentDir/vs.getDatabaseFilename()), args.delete) -if args.process == 'interaction': +if args.process in ['feature', 'object']: # tracking + for videoId in args.videoIds: + vs = session.query(VideoSequence).get(videoId) + if args.configFilename is None: + configFilename = vs.cameraView.getTrackingConfigurationFilename() + else: + configFilename = args.configFilename + #todo cvutils.tracking(configFilename, args.process == 'object', str(parentDir/vs.getVideoSequenceFilename(), str(parentDir/vs.getDatabaseFilename(), configFilename = vs.cameraView.getHomographyFilename()) + +elif args.process == 'interaction': # safety analysis TODO make function in safety analysis script if args.predictionMethod == 'cvd': predictionParameters = prediction.CVDirectPredictionParameters()