Source code for mactrack.video.inputconfig
import cv2
import os
from video.frame import VideoFrames
import numpy as np
# def median_green_intensity(input_folder, output_path):
# image_files = [f for f in os.listdir(input_folder) if f.endswith('.jpg') or f.endswith('.png')]
#
# if not image_files:
# print("No image files found in the folder.")
# return
#
# first_image_path = os.path.join(input_folder, image_files[0])
# first_image = cv2.imread(first_image_path, cv2.IMREAD_COLOR)
# height, width, _ = first_image.shape
#
# green_channel_values = np.zeros((height, width, len(image_files)), dtype=np.uint8)
#
# for idx, image_file in enumerate(image_files):
# image_path = os.path.join(input_folder, image_file)
# image = cv2.imread(image_path, cv2.IMREAD_COLOR)
# green_channel_values[:, :, idx] = image[:, :, 1]
#
# median_green = np.median(green_channel_values, axis=2).astype(np.uint8)
# median_green_image = np.zeros((height, width, 3), dtype=np.uint8)
# median_green_image[:, :, 1] = median_green
# output_file = os.path.join(output_path, 'mediane.png')
# cv2.imwrite(output_file, median_green_image)
[docs]
def median_green_intensity(input_folder, output_path):
"""
Calculate the **median** green intensity from images in a folder and save the result.
Parameters:
input_folder (str): Path to the folder containing images.
output_path (str): Path to save the median green intensity image.
"""
image_files = [
f for f in os.listdir(input_folder) if f.endswith(".jpg") or f.endswith(".png")
]
if not image_files:
print("No image files found in the folder.")
return
first_image_path = os.path.join(input_folder, image_files[0])
first_image = cv2.imread(first_image_path, cv2.IMREAD_COLOR)
if first_image is None:
print(f"Error: Could not read {first_image_path}")
return
height, width, _ = first_image.shape
green_channel_values = np.zeros((height, width, len(image_files)), dtype=np.uint8)
for idx, image_file in enumerate(image_files):
image_path = os.path.join(input_folder, image_file)
image = cv2.imread(image_path, cv2.IMREAD_COLOR)
if image is None:
print(f"Warning: Could not read {image_file}, skipping.")
continue
# Check shape and resize if necessary
if image.shape[:2] != (height, width):
image = cv2.resize(image, (width, height), interpolation=cv2.INTER_AREA)
green_channel_values[:, :, idx] = image[:, :, 1] # Stocke le canal vert
median_green = np.median(green_channel_values, axis=2).astype(np.uint8)
median_green_image = np.zeros((height, width, 3), dtype=np.uint8)
median_green_image[:, :, 1] = median_green # Assigner la médiane au canal vert
output_file = os.path.join(output_path, "mediane.png")
cv2.imwrite(output_file, median_green_image)
print(f"Median green image saved to {output_file}")
[docs]
def create_average_green_image(folder_path, output_path):
"""
Create an **average** green intensity image from images in a folder.
Parameters:
folder_path (str): Path to the folder containing images.
output_path (str): Path to save the average green intensity image.
"""
image_files = [
f
for f in os.listdir(folder_path)
if os.path.isfile(os.path.join(folder_path, f))
]
if not image_files:
raise ValueError("No images found in the folder.")
green_sum = None
image_count = 0
target_size = None
for image_file in image_files:
image_path = os.path.join(folder_path, image_file)
image = cv2.imread(image_path)
if image is None:
print(f"Warning: Could not load image {image_file}, skipping.")
continue
if green_sum is None:
target_size = (image.shape[1], image.shape[0]) # (width, height)
green_sum = np.zeros((target_size[1], target_size[0]), dtype=np.float64)
if (image.shape[1], image.shape[0]) != target_size:
image = cv2.resize(image, target_size)
green_sum += image[:, :, 1]
image_count += 1
if image_count == 0:
raise ValueError("No valid images found in the folder.")
green_mean = (green_sum / image_count).astype(np.uint8)
average_green_image = np.zeros(
(green_mean.shape[0], green_mean.shape[1], 3), dtype=np.uint8
)
average_green_image[:, :, 1] = green_mean
cv2.imwrite(os.path.join(output_path, "moyenne.png"), average_green_image)
print(f"Average green intensity image saved to {output_path}")
[docs]
def inputconfig(input_folder):
"""
Process a video file and its corresponding green channel video file.
Parameters:
input_folder (str): Path to the folder containing the video files.
Returns:
video_frames (VideoFrames): An object containing the processed video frames.
"""
input_folder_v = os.path.join(input_folder, "vert")
output_folder = os.path.join(input_folder, "dataset/test/test_x")
output_folder_v = os.path.join(input_folder_v, "frames")
os.makedirs(output_folder_v, exist_ok=True)
# if the output folders are not empty, delete the content
for f in os.listdir(output_folder_v):
os.remove(os.path.join(output_folder_v, f))
for f in os.listdir(output_folder):
os.remove(os.path.join(output_folder, f))
video_files = [f for f in os.listdir(input_folder) if f.endswith(".mp4")]
if len(video_files) != 1:
print(
"Erreur: Aucun fichier vidéo ou plusieurs fichiers vidéo trouvés dans le dossier."
)
return
video_files_v = [f for f in os.listdir(input_folder_v) if f.endswith(".mp4")]
if len(video_files_v) != 1:
print(
"Erreur: Aucun fichier vidéo ou plusieurs fichiers vidéo trouvés dans le dossier."
)
return
video_filename = video_files[0]
video_path = os.path.join(input_folder, video_filename)
video_filename_v = video_files_v[0]
video_path_v = os.path.join(input_folder_v, video_filename_v)
video_capture = cv2.VideoCapture(video_path)
video_capture_v = cv2.VideoCapture(video_path_v)
count = 0
video_frames = VideoFrames()
while True:
success, frame = video_capture.read()
if not success:
break
success_v, frame_v = video_capture_v.read()
if not success_v:
break
frame_resized = cv2.resize(frame, (frame.shape[1] // 2, frame.shape[0] // 2))
frame_v_resized = cv2.resize(
frame_v, (frame_v.shape[1] // 2, frame_v.shape[0] // 2)
)
video_frames.add_frame(frame_resized)
video_frames.add_frame_v(frame_v_resized)
filename = os.path.join(output_folder, f"{count:03d}_image.png")
cv2.imwrite(filename, frame_resized)
filename_v = os.path.join(output_folder_v, f"{count:03d}_image.png")
cv2.imwrite(filename_v, frame_v_resized)
count += 1
video_capture.release()
video_capture_v.release()
create_average_green_image(output_folder_v, input_folder_v)
median_green_intensity(output_folder_v, input_folder_v)
return video_frames