Untitled
unknown
plain_text
9 months ago
3.7 kB
5
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)Editor is loading...
Leave a Comment