Wednesday, October 8, 2025

 VideoIndexing alleviates redundant processing of each aerial drone video frame. This can be delegated to public cloud video indexing apis or local opencv PySceneDetect. Here is an example: 

from scenedetect import VideoManager, SceneManager 

from scenedetect.detectors import ContentDetector 

from scenedetect.frame_timecode import FrameTimecode 

 

# Path to your aerial drone video 

video_path = 'video01.mp4' 

 

# Initialize video and scene managers 

video_manager = VideoManager([video_path]) 

scene_manager = SceneManager() 

scene_manager.add_detector(ContentDetector(threshold=30.0))  # Adjust threshold for sensitivity 

 

# Start processing 

video_manager.set_downscale_factor()  # Optional: speeds up processing 

video_manager.start() 

scene_manager.detect_scenes(frame_source=video_manager) 

 

# Get list of detected scenes 

scene_list = scene_manager.get_scene_list() 

 

# Print scene boundaries with timestamps and frame indices 

print(f"Detected {len(scene_list)} scenes:") 

for i, (start, end) in enumerate(scene_list): 

    start_frame = start.get_frames() 

    end_frame = end.get_frames() 

    start_time = start.get_timecode() 

    end_time = end.get_timecode() 

    print(f"Scene {i+1}:") 

    print(f"  Start Frame: {start_frame}, Timestamp: {start_time}") 

    print(f"  End Frame:   {end_frame}, Timestamp: {end_time}") 

 

with results as: 

Detected 53 scenes: 

Scene 1: 

  Start Frame: 0, Timestamp: 00:00:00.000 

  End Frame:   303, Timestamp: 00:00:10.107 

Scene 2: 

  Start Frame: 303, Timestamp: 00:00:10.107 

  End Frame:   334, Timestamp: 00:00:11.141 

Scene 3: 

  Start Frame: 334, Timestamp: 00:00:11.141 

  End Frame:   965, Timestamp: 00:00:32.190 

Scene 4: 

  Start Frame: 965, Timestamp: 00:00:32.190 

  End Frame:   1446, Timestamp: 00:00:48.234 

Scene 5: 

  Start Frame: 1446, Timestamp: 00:00:48.234 

  End Frame:   1600, Timestamp: 00:00:53.371 

Scene 6: 

  Start Frame: 1600, Timestamp: 00:00:53.371 

  End Frame:   1631, Timestamp: 00:00:54.405 

Scene 7: 

  Start Frame: 1631, Timestamp: 00:00:54.405 

  End Frame:   1693, Timestamp: 00:00:56.473 

Scene 8: 

  Start Frame: 1693, Timestamp: 00:00:56.473 

  End Frame:   1724, Timestamp: 00:00:57.508 

Scene 9: 

  Start Frame: 1724, Timestamp: 00:00:57.508 

  End Frame:   1785, Timestamp: 00:00:59.542 

Scene 10: 

  Start Frame: 1785, Timestamp: 00:00:59.542 

  End Frame:   1877, Timestamp: 00:01:02.611 

Scene 11: 

  Start Frame: 1877, Timestamp: 00:01:02.611 

  End Frame:   2208, Timestamp: 00:01:13.652 

Scene 12: 

  Start Frame: 2208, Timestamp: 00:01:13.652 

  End Frame:   2269, Timestamp: 00:01:15.687 

Scene 13: 

  Start Frame: 2269, Timestamp: 00:01:15.687 

  End Frame:   2303, Timestamp: 00:01:16.821 

Scene 14: 

  Start Frame: 2303, Timestamp: 00:01:16.821 

  End Frame:   2567, Timestamp: 00:01:25.627 

Scene 15: 

  Start Frame: 2567, Timestamp: 00:01:25.627 

  End Frame:   2601, Timestamp: 00:01:26.762 

Scene 16: 

  Start Frame: 2601, Timestamp: 00:01:26.762 

  End Frame:   2784, Timestamp: 00:01:32.866 

Scene 17: 

  Start Frame: 2784, Timestamp: 00:01:32.866 

  End Frame:   2845, Timestamp: 00:01:34.901 

Scene 18: 

  Start Frame: 2845, Timestamp: 00:01:34.901 

  End Frame:   2883, Timestamp: 00:01:36.168 

Scene 19: 

  Start Frame: 2883, Timestamp: 00:01:36.168 

  End Frame:   3034, Timestamp: 00:01:41.205 

Scene 20: 

  Start Frame: 3034, Timestamp: 00:01:41.205 

  End Frame:   3079, Timestamp: 00:01:42.706 

Scene 21: 

  Start Frame: 3079, Timestamp: 00:01:42.706 

  End Frame:   3276, Timestamp: 00:01:49.278 

Scene 22: 

  Start Frame: 3276, Timestamp: 00:01:49.278 

  End Frame:   3307, Timestamp: 00:01:50.312 

Scene 23: 

  Start Frame: 3307, Timestamp: 00:01:50.312 

  End Frame:   3339, Timestamp: 00:01:51.379 

Scene 24: 

  Start Frame: 3339, Timestamp: 00:01:51.379 

  End Frame:   3370, Timestamp: 00:01:52.413 

Scene 25: 

  Start Frame: 3370, Timestamp: 00:01:52.413 

  End Frame:   3492, Timestamp: 00:01:56.483 

Scene 26: 

  Start Frame: 3492, Timestamp: 00:01:56.483 

  End Frame:   3613, Timestamp: 00:02:00.519 

Scene 27: 

  Start Frame: 3613, Timestamp: 00:02:00.519 

  End Frame:   3644, Timestamp: 00:02:01.553 

Scene 28: 

  Start Frame: 3644, Timestamp: 00:02:01.553 

  End Frame:   3735, Timestamp: 00:02:04.588 

Scene 29: 

  Start Frame: 3735, Timestamp: 00:02:04.588 

  End Frame:   3796, Timestamp: 00:02:06.623 

Scene 30: 

  Start Frame: 3796, Timestamp: 00:02:06.623 

  End Frame:   4221, Timestamp: 00:02:20.800 

Scene 31: 

  Start Frame: 4221, Timestamp: 00:02:20.800 

  End Frame:   4252, Timestamp: 00:02:21.834 

Scene 32: 

  Start Frame: 4252, Timestamp: 00:02:21.834 

  End Frame:   4463, Timestamp: 00:02:28.872 

Scene 33: 

  Start Frame: 4463, Timestamp: 00:02:28.872 

  End Frame:   4764, Timestamp: 00:02:38.913 

Scene 34: 

  Start Frame: 4764, Timestamp: 00:02:38.913 

  End Frame:   5038, Timestamp: 00:02:48.053 

Scene 35: 

  Start Frame: 5038, Timestamp: 00:02:48.053 

  End Frame:   5069, Timestamp: 00:02:49.087 

Scene 36: 

  Start Frame: 5069, Timestamp: 00:02:49.087 

  End Frame:   5101, Timestamp: 00:02:50.154 

Scene 37: 

  Start Frame: 5101, Timestamp: 00:02:50.154 

  End Frame:   5312, Timestamp: 00:02:57.193 

Scene 38: 

  Start Frame: 5312, Timestamp: 00:02:57.193 

  End Frame:   5373, Timestamp: 00:02:59.227 

Scene 39: 

  Start Frame: 5373, Timestamp: 00:02:59.227 

  End Frame:   6004, Timestamp: 00:03:20.276 

Scene 40: 

  Start Frame: 6004, Timestamp: 00:03:20.276 

  End Frame:   6035, Timestamp: 00:03:21.310 

Scene 41: 

  Start Frame: 6035, Timestamp: 00:03:21.310 

  End Frame:   6133, Timestamp: 00:03:24.579 

Scene 42: 

  Start Frame: 6133, Timestamp: 00:03:24.579 

  End Frame:   6184, Timestamp: 00:03:26.280 

Scene 43: 

  Start Frame: 6184, Timestamp: 00:03:26.280 

  End Frame:   6437, Timestamp: 00:03:34.719 

Scene 44: 

  Start Frame: 6437, Timestamp: 00:03:34.719 

  End Frame:   6498, Timestamp: 00:03:36.754 

Scene 45: 

  Start Frame: 6498, Timestamp: 00:03:36.754 

  End Frame:   6529, Timestamp: 00:03:37.788 

Scene 46: 

  Start Frame: 6529, Timestamp: 00:03:37.788 

  End Frame:   6710, Timestamp: 00:03:43.826 

Scene 47: 

  Start Frame: 6710, Timestamp: 00:03:43.826 

  End Frame:   6863, Timestamp: 00:03:48.929 

Scene 48: 

  Start Frame: 6863, Timestamp: 00:03:48.929 

  End Frame:   6894, Timestamp: 00:03:49.963 

Scene 49: 

  Start Frame: 6894, Timestamp: 00:03:49.963 

  End Frame:   7465, Timestamp: 00:04:09.010 

Scene 50: 

  Start Frame: 7465, Timestamp: 00:04:09.010 

  End Frame:   7982, Timestamp: 00:04:26.256 

Scene 51: 

  Start Frame: 7982, Timestamp: 00:04:26.256 

  End Frame:   8104, Timestamp: 00:04:30.325 

Scene 52: 

  Start Frame: 8104, Timestamp: 00:04:30.325 

  End Frame:   8675, Timestamp: 00:04:49.372 

Scene 53: 

  Start Frame: 8675, Timestamp: 00:04:49.372 

  End Frame:   9216, Timestamp: 00:05:07.418 

 

These can be stitched back into a new video file and re-indexed to further shorten the extracted video. 
Preserving actual timestamps on re-indexing is as simple as: 

from datetime import datetime, timedelta 
 
def parse_timecode(timecode): 
    # Parse HH:mm:ss.SSS string to timedelta from zero time 
    return datetime.strptime(timecode, "%H:%M:%S.%f") - datetime.strptime("00:00:00.000", "%H:%M:%S.%f") 
 
def map_offset_to_timestamp_with_validation(intervals, offset): 
    total_duration = timedelta(0) 

    actual_time = -1 
    for start, end in intervals: 
        start_td = parse_timecode(start) 
        end_td = parse_timecode(end) 
        interval_duration = end_td - start_td 
        if offset < total_duration.total_seconds() + interval_duration.total_seconds(): 
            offset_in_interval = offset - total_duration.total_seconds() 
            actual_time = start_td + timedelta(seconds=offset_in_interval) 
        total_duration += interval_duration 
    for start, end in intervals: 
        if start_td <= actual_time <= end_td: 
                return actual_time 

    return -1 
# Example usage: 
intervals = [("00:00:00.000", "00:00:10.000"), ("00:02:00.000", "00:02:05.000")] 
print(map_offset_to_timestamp_with_validation(intervals, 12))  # Returns timedelta at 00:02:02 
print(map_offset_to_timestamp_with_validation(intervals, 20))  # Returns -1 since offset out of range 

Cost Comparison: 

Prompt: Are there dedicated bicycle crossings in green color at street intersections in the attached set of aerial drone images? (+ 26 images extracted from re/indexed drone video) 

Answer: Yes, there are **dedicated bicycle crossings in green color at street intersections** visible in the attached set of aerial drone images. 

- In several of the images (notably the 12th and 15th images), you can clearly see a **bright green marking** extending across a lane at a street intersection. This matches the standard implementation of green pavement marking treatments used to highlight and designate bike crossings at intersection conflict points[1][2][3][5]. 

- Such markings are a dedicated safety feature, making bicycle paths and crossings more visible to both cyclists and motorists. They are typically installed at intersections or approach lanes to indicate the preferred bicycle route and reduce the likelihood of conflicts[1][2][3][5]. 

All other intersections depicted in these images lack such green bicycle crossings, but the presence of these markings in some images directly confirms their implementation in this area. 

Type 

Count 

Total_Tokens 

Total_cost 

Indexed video/extracted images  

26 

49316 (99% input-side, 1% output-side) 

0.156 

Original aerial drone video 

17776 

35,500,000 

$270 (including vector index and search) 

 

No comments:

Post a Comment