Untitled

 avatar
unknown
plain_text
a month ago
3.7 kB
2
Indexable
import cv2
import os
import shutil
from tqdm import tqdm

# Create directories for output and frames
def create_dirs(output_folder):
    if os.path.exists(output_folder):
        shutil.rmtree(output_folder)
    os.makedirs(output_folder)
    os.makedirs(os.path.join(output_folder, "frames"))

# Extract frames from video
def extract_frames(video_path, frame_folder):
    video_capture = cv2.VideoCapture(video_path)
    total_frames = int(video_capture.get(cv2.CAP_PROP_FRAME_COUNT))
    
    print(f"Extracting {total_frames} frames...")
    for frame_count in tqdm(range(total_frames)):
        ret, frame = video_capture.read()
        if not ret:
            break
        # Save each frame as an image
        cv2.imwrite(os.path.join(frame_folder, f"frame_{frame_count:04d}.jpg"), frame)
    video_capture.release()
    print("Frame extraction complete.")

# Process the frames to create new frames by averaging and finding the median
def process_frames(frame_folder, output_folder):
    frame_files = sorted(os.listdir(frame_folder))
    processed_frames = []
    
    print(f"Processing frames...")
    for i in tqdm(range(len(frame_files) - 1)):
        frame1 = cv2.imread(os.path.join(frame_folder, frame_files[i]))
        frame2 = cv2.imread(os.path.join(frame_folder, frame_files[i + 1]))
        
        # Ensure frames are of the same size
        if frame1.shape != frame2.shape:
            continue
        
        # Add the frames and find the median pixel by pixel
        new_frame = cv2.add(frame1, frame2)
        median_frame = cv2.medianBlur(new_frame, 3)  # You can adjust the kernel size here

        # Save the processed frame
        processed_filename = f"processed_frame_{i:04d}.jpg"
        cv2.imwrite(os.path.join(output_folder, processed_filename), median_frame)
        processed_frames.append(median_frame)

    print("Frames processing complete.")
    return processed_frames

# Combine processed frames into the final video
def combine_frames(processed_frames, output_video_path):
    if not processed_frames:
        print("No frames to combine.")
        return
    
    height, width, _ = processed_frames[0].shape
    fourcc = cv2.VideoWriter_fourcc(*"mp4v")  # You can change codec here
    video_writer = cv2.VideoWriter(output_video_path, fourcc, 30, (width, height))
    
    print(f"Combining frames into final video...")
    for i, frame in tqdm(enumerate(processed_frames), total=len(processed_frames)):
        video_writer.write(frame)
    video_writer.release()
    print(f"Video saved at {output_video_path}")

# Main function to run the entire process
def main(source_folder, output_folder, video_filename):
    create_dirs(output_folder)
    
    video_path = os.path.join(source_folder, video_filename)
    frame_folder = os.path.join(output_folder, "frames")
    
    # Step 1: Extract frames from video
    extract_frames(video_path, frame_folder)
    
    # Step 2: Process frames (e.g., averaging and median calculation)
    processed_frames = process_frames(frame_folder, output_folder)
    
    # Step 3: Combine frames into the final video
    output_video_path = os.path.join(output_folder, "output_video.mp4")
    combine_frames(processed_frames, output_video_path)
    
    # Step 4: Clean up the frames after processing to save space
    shutil.rmtree(frame_folder)
    print("Temporary frame files deleted.")

if __name__ == "__main__":
    source_folder = "source_video_folder"  # Folder containing your video file
    output_folder = "output_folder"  # Folder where processed frames and final video will be saved
    video_filename = "video.mp4"  # Name of the video file in the source folder
    
    main(source_folder, output_folder, video_filename)
Leave a Comment