Mercurial > hg > nsaunier > traffic-intelligence
comparison python/storage.py @ 615:0954aaf28231
Merge
| author | MohamedGomaa |
|---|---|
| date | Wed, 10 Dec 2014 14:12:06 -0500 |
| parents | 84690dfe5560 c5406edbcf12 |
| children | dc2d0a0d7fe1 |
comparison
equal
deleted
inserted
replaced
| 613:306db0f3c7a2 | 615:0954aaf28231 |
|---|---|
| 32 for tableName in tableNames: | 32 for tableName in tableNames: |
| 33 cursor.execute('DROP TABLE IF EXISTS '+tableName) | 33 cursor.execute('DROP TABLE IF EXISTS '+tableName) |
| 34 except sqlite3.OperationalError as error: | 34 except sqlite3.OperationalError as error: |
| 35 printDBError(error) | 35 printDBError(error) |
| 36 | 36 |
| 37 # TODO: add test if database connection is open | |
| 37 # IO to sqlite | 38 # IO to sqlite |
| 38 def writeTrajectoriesToSqlite(objects, outputFilename, trajectoryType, objectNumbers = -1): | 39 def writeTrajectoriesToSqlite(objects, outputFilename, trajectoryType, objectNumbers = -1): |
| 39 """ | 40 """ |
| 40 This function writers trajectories to a specified sqlite file | 41 This function writers trajectories to a specified sqlite file |
| 41 @param[in] objects -> a list of trajectories | 42 @param[in] objects -> a list of trajectories |
| 291 | 292 |
| 292 def getTrajectoryIdQuery(objectNumbers, trajectoryType): | 293 def getTrajectoryIdQuery(objectNumbers, trajectoryType): |
| 293 if trajectoryType == 'feature': | 294 if trajectoryType == 'feature': |
| 294 statementBeginning = 'where trajectory_id ' | 295 statementBeginning = 'where trajectory_id ' |
| 295 elif trajectoryType == 'object': | 296 elif trajectoryType == 'object': |
| 296 statementBeginning = 'and OF.object_id ' | 297 statementBeginning = 'and OF.object_id ' |
| 298 elif trajectoryType == 'bbtop' or 'bbbottom': | |
| 299 statementBeginning = 'where object_id ' | |
| 297 else: | 300 else: |
| 298 print('no trajectory type was chosen') | 301 print('no trajectory type was chosen') |
| 299 | 302 |
| 300 if type(objectNumbers) == int: | 303 if objectNumbers is None: |
| 301 if objectNumbers == -1: | 304 query = '' |
| 302 query = '' | 305 elif type(objectNumbers) == int: |
| 303 else: | 306 query = statementBeginning+'between 0 and {0} '.format(objectNumbers) |
| 304 query = statementBeginning+'between 0 and {0} '.format(objectNumbers) | |
| 305 elif type(objectNumbers) == list: | 307 elif type(objectNumbers) == list: |
| 306 query = statementBeginning+'in ('+', '.join([str(n) for n in objectNumbers])+') ' | 308 query = statementBeginning+'in ('+', '.join([str(n) for n in objectNumbers])+') ' |
| 307 return query | 309 return query |
| 308 | 310 |
| 309 def loadTrajectoriesFromTable(connection, tableName, trajectoryType, objectNumbers = -1): | 311 def loadTrajectoriesFromTable(connection, tableName, trajectoryType, objectNumbers = None): |
| 310 '''Loads trajectories (in the general sense) from the given table | 312 '''Loads trajectories (in the general sense) from the given table |
| 311 can be positions or velocities | 313 can be positions or velocities |
| 312 | 314 |
| 313 returns a moving object''' | 315 returns a moving object''' |
| 314 cursor = connection.cursor() | 316 cursor = connection.cursor() |
| 315 | 317 |
| 316 try: | 318 try: |
| 319 idQuery = getTrajectoryIdQuery(objectNumbers, trajectoryType) | |
| 317 if trajectoryType == 'feature': | 320 if trajectoryType == 'feature': |
| 318 trajectoryIdQuery = getTrajectoryIdQuery(objectNumbers, trajectoryType) | 321 queryStatement = 'SELECT * from '+tableName+' '+idQuery+'ORDER BY trajectory_id, frame_number' |
| 319 queryStatement = 'SELECT * from '+tableName+' '+trajectoryIdQuery+'order by trajectory_id, frame_number' | |
| 320 cursor.execute(queryStatement) | 322 cursor.execute(queryStatement) |
| 321 logging.debug(queryStatement) | 323 logging.debug(queryStatement) |
| 322 elif trajectoryType == 'object': | 324 elif trajectoryType == 'object': |
| 323 objectIdQuery = getTrajectoryIdQuery(objectNumbers, trajectoryType) | 325 queryStatement = 'SELECT OF.object_id, P.frame_number, avg(P.x_coordinate), avg(P.y_coordinate) from '+tableName+' P, objects_features OF where P.trajectory_id = OF.trajectory_id '+idQuery+'group by OF.object_id, P.frame_number ORDER BY OF.object_id, P.frame_number' |
| 324 queryStatement = 'SELECT OF.object_id, P.frame_number, avg(P.x_coordinate), avg(P.y_coordinate) from '+tableName+' P, objects_features OF where P.trajectory_id = OF.trajectory_id '+objectIdQuery+'group by OF.object_id, P.frame_number order by OF.object_id, P.frame_number' | 326 cursor.execute(queryStatement) |
| 327 logging.debug(queryStatement) | |
| 328 elif trajectoryType in ['bbtop', 'bbbottom']: | |
| 329 if trajectoryType == 'bbtop': | |
| 330 corner = 'top_left' | |
| 331 elif trajectoryType == 'bbbottom': | |
| 332 corner = 'bottom_right' | |
| 333 queryStatement = 'SELECT object_id, frame_number, x_'+corner+', y_'+corner+' FROM '+tableName+' '+trajectoryIdQuery+'ORDER BY object_id, frame_number' | |
| 325 cursor.execute(queryStatement) | 334 cursor.execute(queryStatement) |
| 326 logging.debug(queryStatement) | 335 logging.debug(queryStatement) |
| 327 else: | 336 else: |
| 328 print('no trajectory type was chosen') | 337 print('no trajectory type was chosen') |
| 329 except sqlite3.OperationalError as error: | 338 except sqlite3.OperationalError as error: |
| 334 obj = None | 343 obj = None |
| 335 objects = [] | 344 objects = [] |
| 336 for row in cursor: | 345 for row in cursor: |
| 337 if row[0] != objId: | 346 if row[0] != objId: |
| 338 objId = row[0] | 347 objId = row[0] |
| 339 if obj: | 348 if obj != None and obj.length() == obj.positions.length(): |
| 340 objects.append(obj) | 349 objects.append(obj) |
| 350 elif obj != None: | |
| 351 print('Object {} is missing {} positions'.format(obj.getNum(), int(obj.length())-obj.positions.length())) | |
| 341 obj = moving.MovingObject(row[0], timeInterval = moving.TimeInterval(row[1], row[1]), positions = moving.Trajectory([[row[2]],[row[3]]])) | 352 obj = moving.MovingObject(row[0], timeInterval = moving.TimeInterval(row[1], row[1]), positions = moving.Trajectory([[row[2]],[row[3]]])) |
| 342 else: | 353 else: |
| 343 obj.timeInterval.last = row[1] | 354 obj.timeInterval.last = row[1] |
| 344 obj.positions.addPositionXY(row[2],row[3]) | 355 obj.positions.addPositionXY(row[2],row[3]) |
| 345 | 356 |
| 346 if obj: | 357 if obj != None and obj.length() == obj.positions.length(): |
| 347 objects.append(obj) | 358 objects.append(obj) |
| 359 elif obj != None: | |
| 360 print('Object {} is missing {} positions'.format(obj.getNum(), int(obj.length())-obj.positions.length())) | |
| 348 | 361 |
| 349 return objects | 362 return objects |
| 350 | 363 |
| 351 def loadTrajectoriesFromSqlite(filename, trajectoryType, objectNumbers = -1): | 364 def loadUserTypesFromTable(cursor, trajectoryType, objectNumbers): |
| 352 '''Loads nObjects or the indices in objectNumbers from the database''' | 365 objectIdQuery = getTrajectoryIdQuery(objectNumbers, trajectoryType) |
| 353 connection = sqlite3.connect(filename) # add test if it open | 366 if objectIdQuery == '': |
| 367 cursor.execute('SELECT object_id, road_user_type from objects') | |
| 368 else: | |
| 369 cursor.execute('SELECT object_id, road_user_type from objects where '+objectIdQuery[7:]) | |
| 370 userTypes = {} | |
| 371 for row in cursor: | |
| 372 userTypes[row[0]] = row[1] | |
| 373 return userTypes | |
| 374 | |
| 375 def loadTrajectoriesFromSqlite(filename, trajectoryType, objectNumbers = None): | |
| 376 '''Loads the first objectNumbers objects or the indices in objectNumbers from the database''' | |
| 377 connection = sqlite3.connect(filename) | |
| 354 | 378 |
| 355 objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers) | 379 objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers) |
| 356 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers) | 380 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers) |
| 357 | 381 |
| 358 if len(objectVelocities) > 0: | 382 if len(objectVelocities) > 0: |
| 382 | 406 |
| 383 for obj in objects: | 407 for obj in objects: |
| 384 obj.featureNumbers = featureNumbers[obj.getNum()] | 408 obj.featureNumbers = featureNumbers[obj.getNum()] |
| 385 | 409 |
| 386 # load userType | 410 # load userType |
| 387 if objectIdQuery == '': | 411 userTypes = loadUserTypesFromTable(cursor, trajectoryType, objectNumbers) |
| 388 cursor.execute('SELECT object_id, road_user_type from objects') | |
| 389 else: | |
| 390 cursor.execute('SELECT object_id, road_user_type from objects where '+objectIdQuery[7:]) | |
| 391 userTypes = {} | |
| 392 for row in cursor: | |
| 393 userTypes[row[0]] = row[1] | |
| 394 | |
| 395 for obj in objects: | 412 for obj in objects: |
| 396 obj.userType = userTypes[obj.getNum()] | 413 obj.userType = userTypes[obj.getNum()] |
| 397 | 414 |
| 398 except sqlite3.OperationalError as error: | 415 except sqlite3.OperationalError as error: |
| 399 printDBError(error) | 416 printDBError(error) |
| 400 return [] | 417 objects = [] |
| 401 | 418 |
| 402 connection.close() | 419 connection.close() |
| 403 return objects | 420 return objects |
| 404 | 421 |
| 405 def removeFromSqlite(filename, dataType): | 422 def loadGroundTruthFromSqlite(filename, gtType, gtNumbers = None): |
| 406 'Removes some tables in the filename depending on type of data' | 423 'Loads bounding box annotations (ground truth) from an SQLite ' |
| 424 connection = sqlite3.connect(filename) | |
| 425 gt = [] | |
| 426 | |
| 427 if gtType == 'bb': | |
| 428 topCorners = loadTrajectoriesFromTable(connection, 'bounding_boxes', 'bbtop', gtNumbers) | |
| 429 bottomCorners = loadTrajectoriesFromTable(connection, 'bounding_boxes', 'bbbottom', gtNumbers) | |
| 430 userTypes = loadUserTypesFromTable(connection.cursor(), 'object', gtNumbers) # string format is same as object | |
| 431 | |
| 432 for t, b in zip(topCorners, bottomCorners): | |
| 433 num = t.getNum() | |
| 434 if t.getNum() == b.getNum(): | |
| 435 annotation = moving.BBAnnotation(num, t.getTimeInterval(), t, b, userTypes[num]) | |
| 436 gt.append(annotation) | |
| 437 else: | |
| 438 print ('Unknown type of annotation {}'.format(gtType)) | |
| 439 | |
| 440 connection.close() | |
| 441 return gt | |
| 442 | |
| 443 def deleteFromSqlite(filename, dataType): | |
| 444 'Deletes (drops) some tables in the filename depending on type of data' | |
| 407 import os | 445 import os |
| 408 if os.path.isfile(filename): | 446 if os.path.isfile(filename): |
| 409 connection = sqlite3.connect(filename) | 447 connection = sqlite3.connect(filename) |
| 410 if dataType == 'object': | 448 if dataType == 'object': |
| 411 dropTables(connection, ['objects', 'objects_features']) | 449 dropTables(connection, ['objects', 'objects_features']) |
| 523 except sqlite3.OperationalError as error: | 561 except sqlite3.OperationalError as error: |
| 524 printDBError(error) | 562 printDBError(error) |
| 525 connection.commit() | 563 connection.commit() |
| 526 connection.close() | 564 connection.close() |
| 527 | 565 |
| 528 def loadBoundingBoxTable(filename): | 566 def loadBoundingBoxTableForDisplay(filename): |
| 529 connection = sqlite3.connect(filename) | 567 connection = sqlite3.connect(filename) |
| 530 cursor = connection.cursor() | 568 cursor = connection.cursor() |
| 531 boundingBoxes = {} # list of bounding boxes for each instant | 569 boundingBoxes = {} # list of bounding boxes for each instant |
| 532 try: | 570 try: |
| 533 cursor.execute('SELECT name FROM sqlite_master WHERE type=\'table\' AND name=\'bounding_boxes\'') | 571 cursor.execute('SELECT name FROM sqlite_master WHERE type=\'table\' AND name=\'bounding_boxes\'') |
| 534 result = [row for row in cursor] | 572 result = [row for row in cursor] |
| 535 if len(result) > 0: | 573 if len(result) > 0: |
| 536 cursor.execute('SELECT * FROM bounding_boxes') | 574 cursor.execute('SELECT * FROM bounding_boxes') |
| 537 #objId = -1 | |
| 538 for row in cursor: | 575 for row in cursor: |
| 539 #if row[0] != objId: | |
| 540 boundingBoxes.setdefault(row[1], []).append([moving.Point(row[2], row[3]), moving.Point(row[4], row[5])]) | 576 boundingBoxes.setdefault(row[1], []).append([moving.Point(row[2], row[3]), moving.Point(row[4], row[5])]) |
| 577 except sqlite3.OperationalError as error: | |
| 578 printDBError(error) | |
| 579 return boundingBoxes | |
| 580 connection.close() | |
| 581 return boundingBoxes | |
| 582 | |
| 583 def loadBoundingBoxTable(filename): | |
| 584 connection = sqlite3.connect(filename) | |
| 585 cursor = connection.cursor() | |
| 586 boundingBoxes = [] | |
| 587 | |
| 588 try: | |
| 589 pass | |
| 541 except sqlite3.OperationalError as error: | 590 except sqlite3.OperationalError as error: |
| 542 printDBError(error) | 591 printDBError(error) |
| 543 return boundingBoxes | 592 return boundingBoxes |
| 544 connection.close() | 593 connection.close() |
| 545 return boundingBoxes | 594 return boundingBoxes |
