()
| 99 | print(f"Successfully created video for prefix '{prefix}': {output_video_path}") |
| 100 | |
| 101 | def main(): |
| 102 | parser = argparse.ArgumentParser(description="Crop images and create video(s). Supports a special mode for render outputs.") |
| 103 | parser.add_argument('--input_folder', type=str, required=True, help='Path to the source folder. If it contains "renders" and "gt" subfolders, special mode is activated.') |
| 104 | parser.add_argument('--output_folder', type=str, help='(Generic mode only) Path to the folder where the final video(s) will be saved.') |
| 105 | parser.add_argument('--fps', type=int, default=25, help='Frames per second for the output video(s).') |
| 106 | parser.add_argument('--max_frames', type=int, default=None, help='Maximum number of frames for each video. Defaults to all frames.') |
| 107 | args = parser.parse_args() |
| 108 | |
| 109 | renders_path = os.path.join(args.input_folder, 'renders') |
| 110 | gt_path = os.path.join(args.input_folder, 'gt') |
| 111 | |
| 112 | # Special mode for processing render outputs |
| 113 | if os.path.isdir(renders_path) and os.path.isdir(gt_path): |
| 114 | print("Detected 'renders' and 'gt' subfolders. Activating special render output mode.") |
| 115 | |
| 116 | # 1. Process 'renders' folder: crop images, create video, then cleanup |
| 117 | print("\n--- Processing 'renders' folder ---") |
| 118 | video_output_folder = os.path.join(args.input_folder, 'video_crop') |
| 119 | temp_renders_crop_folder = os.path.join(video_output_folder, "temp_cropped_renders") |
| 120 | |
| 121 | try: |
| 122 | os.makedirs(video_output_folder, exist_ok=True) |
| 123 | crop_images(renders_path, temp_renders_crop_folder) |
| 124 | if os.listdir(temp_renders_crop_folder): |
| 125 | create_videos_by_prefix(temp_renders_crop_folder, video_output_folder, args.fps, args.max_frames) |
| 126 | else: |
| 127 | print("No images found in 'renders' folder to process.") |
| 128 | finally: |
| 129 | if os.path.exists(temp_renders_crop_folder): |
| 130 | print(f"Cleaning up temporary folder: {temp_renders_crop_folder}") |
| 131 | shutil.rmtree(temp_renders_crop_folder) |
| 132 | |
| 133 | # 2. Process 'gt' folder: crop images and save them directly |
| 134 | print("\n--- Processing 'gt' folder ---") |
| 135 | gt_crop_output_folder = os.path.join(args.input_folder, 'gt_crop') |
| 136 | crop_images(gt_path, gt_crop_output_folder) |
| 137 | |
| 138 | # Generic mode (original functionality) |
| 139 | else: |
| 140 | print("Running in generic mode (no 'renders'/'gt' subfolders found).") |
| 141 | if not args.output_folder: |
| 142 | parser.error("--output_folder is required in generic mode.") |
| 143 | |
| 144 | temp_crop_folder = os.path.join(args.output_folder, "temp_cropped_images") |
| 145 | os.makedirs(args.output_folder, exist_ok=True) |
| 146 | |
| 147 | try: |
| 148 | crop_images(args.input_folder, temp_crop_folder) |
| 149 | if os.listdir(temp_crop_folder): |
| 150 | create_videos_by_prefix(temp_crop_folder, args.output_folder, args.fps, args.max_frames) |
| 151 | else: |
| 152 | print("No images found in source folder to process.") |
| 153 | finally: |
| 154 | if os.path.exists(temp_crop_folder): |
| 155 | print(f"Cleaning up temporary folder: {temp_crop_folder}") |
| 156 | shutil.rmtree(temp_crop_folder) |
| 157 | |
| 158 | if __name__ == '__main__': |
no test coverage detected