_, img = vc.read() if img is None: break current_frame_position += 1 img = cv2.resize( img, (int(img.shape[1] * scale_factor), int(img.shape[0] * scale_factor))) # detect objects in frame bboxes = detector.detect(img) detections = [] # our list of Detections objects bb = None current_time = datetime.datetime.now() if bboxes is not None and len(bboxes) > 0: for i, bb in enumerate(bboxes): det = Detection() det.bbox = np.array([bb[0], bb[1], bb[2], bb[3]]) det.frame_id = current_frame_position detections.append(det) # DRAW DETECTIONS IN GREEN (B, G, R) = (0, 255, 0) cv2.rectangle(img, (bb[0], bb[1]), (bb[2], bb[3]), (0, 255, 0), 2) # log the data, recall headers = ['time', 'id', 'x1', 'y1', 'x2', 'y2'] bb_id = i data = [current_time, bb_id, bb[0], bb[1], bb[2], bb[3]] logger.log(data=data) tracker.update_tracks(detections=detections, frame_id=current_frame_position) tracker.draw_tracks(img) cv2.imshow('img', img) key = cv2.waitKey(1) # if key == 27:
def run(): # create access to settings object settings = Settings() # initiate logging if settings.ENABLE_LOGGING is True: if not os.path.exists(settings.LOGGING_DIRECTORY): os.mkdir(settings.LOGGING_DIRECTORY) log_filename = os.path.join(settings.LOGGING_DIRECTORY, settings.OUTPUT_VIDEO_FILENAME + '.csv') # [current_frame_position, current_time_string, uid, latest_bbox, lidar_distance] headers = [ 'frame#', 'time', 'uid', 'x1', 'y1', 'x2', 'y2', 'lidar_d(ft)', 'grnd_angle_d(ft)' ] data_logger = DataLogger(filename=log_filename, headers=headers) vc = cv2.VideoCapture() if settings.SIMULATION_MODE is True: vc.open(settings.INPUT_VIDEO_FILE) else: vc.open(settings.WEBCAM_ID) if settings.RECORD_VIDEO is True: if not os.path.exists(settings.OUTPUT_VIDEO_FOLDER): os.mkdir(settings.OUTPUT_VIDEO_FOLDER) # get first frame of video to get recording size _, frame = vc.read() # declare video writer obj fourcc = cv2.VideoWriter_fourcc(*'XVID') vw = cv2.VideoWriter( os.path.join(settings.OUTPUT_VIDEO_FOLDER, settings.OUTPUT_VIDEO_FILENAME + '.avi'), fourcc, 20.0, (frame.shape[1], frame.shape[0])) detector = CarDetector() tracker = MultipleObjectTracker() if settings.SIMULATION_MODE is True: lidar = LidarSensor(mode='simulation', simulation_data_file=settings.SIMULATION_FILE) else: lidar = LidarSensor() distance_predictor = DistancePredictor() scale_factor = 0.75 # reduce frame by this size tracked_bbox = [] # a list of past bboxes current_frame_position = 0 while True: # take a snapshot of the current time current_time = datetime.datetime.now() current_time_string = current_time.strftime( '%Y-%m-%d %H:%M:%S.%f')[:-3] # first get lidar distance lidar_distance = lidar.get_distance( frame_number=current_frame_position) # now acquire image and get detections _, img = vc.read() if img is None: print 'null image retrieved! frame={}'.format( current_frame_position) break current_frame_position += 1 img = cv2.resize(img, (int( img.shape[1] * scale_factor), int(img.shape[0] * scale_factor))) # detect objects in frame bboxes = detector.detect(img) detections = [] # our list of Detections objects bb = None if bboxes is not None and len(bboxes) > 0: for i, bb in enumerate(bboxes): det = Detection() det.bbox = np.array([bb[0], bb[1], bb[2], bb[3]]) det.frame_id = current_frame_position detections.append(det) # DRAW DETECTIONS IN GREEN (B, G, R) = (0, 255, 0) cv2.rectangle(img, (bb[0], bb[1]), (bb[2], bb[3]), (0, 255, 0), 2) # log the data, recall headers = ['time', 'id', 'x1', 'y1', 'x2', 'y2'] bb_id = i data = [current_time, bb_id, bb[0], bb[1], bb[2], bb[3]] tracker.update_tracks(detections=detections, frame_id=current_frame_position) # create a list of the current row for logging logging_data = [] # get the "head" of each track current_tracks = tracker.get_track_heads() for current_track in current_tracks: latest_bbox = current_track.get_latest_bb() # get predicted distances from bounding box predicted_distances = distance_predictor.predict(latest_bbox) uid = current_track.uid logging_row = [ current_frame_position, current_time_string, uid, latest_bbox[0], latest_bbox[1], latest_bbox[2], latest_bbox[3], lidar_distance, predicted_distances[0] ] logging_data.append(logging_row) if settings.ENABLE_LOGGING is True: data_logger.log(logging_data) tracker.draw_tracks(img) # draw lidar distance cv2.putText(img, 'lidar_dist = ' + str(int(lidar_distance)) + 'ft', (0, 25), 1, 1.5, (255, 0, 0), 2) cv2.imshow('img', img) key = cv2.waitKey(1) if key == 27: break if settings.RECORD_VIDEO is True: # rescale image back to original shape img = cv2.resize(img, (int(img.shape[1] / scale_factor), int(img.shape[0] / scale_factor))) vw.write(img)