File size: 4,628 Bytes
4ec6f12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# Taking each video cropping to 520, 400, 3, and obtaining 12 key frames for the usage in a dataset.
# Frames will be saved as individual images.

import numpy as np
import cv2, os
from tqdm import tqdm


# Obtain 12 different keyframes from the video, equally spaced.

# Actually to increase dataset we will just increase the number of frames allowed to say 50 per video. 900 images for dataset, 200 are for training.
def get_equal_elements(array, num_elements=12):
    """
  Takes a specific number of elements equally spaced from an array.

  Args:
      array: The input array.
      num_elements: The number of elements to take (default 12).

  Returns:
      A list of elements from the array.
  """
    if num_elements > len(array):
        print(f"Number of elements cannot be greater than array length : {len(array)}")
        return []
    step_size = len(array) // (num_elements - 1)  # Avoid extra element with floor division
    return array[::step_size]  # Slice with step size


def video_to_keyframes(video_filename):
    cap = cv2.VideoCapture(video_filename)
    frames = []
    while (cap.isOpened()):
        ret, frame = cap.read()
        try:
            # 720, 1280, 3
            # Remove top 200 pixels from video frame.
            # print((frame.shape))   # (720, 1280, 3)
            frame = frame[200:, 440:840]
            # print((frame.shape)) # (520, 400, 3)
            frames.append(frame)
            # cv2.imshow('frame',frame)
        except Exception as e:
            print(f"Error is {e}")
            if frame == None:
                break
            continue
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()
    print("Done obtaining captured frames.")
    selected_frames = get_equal_elements(frames, num_elements=50)
    print("Obtained selected frames.")
    # Extract filename without extension for directory creation
    filename_no_ext = video_filename.split('.')[0]
    if "left" in filename_no_ext:
        filename_no_ext = "left"
    else:
        filename_no_ext = "right"
    # Create directory for the video if it doesn't exist
    try:
        os.makedirs(os.path.join("dataset", filename_no_ext))
    except FileExistsError:

        pass  # Directory already exists, ignore

    # Save each selected frame as an image with filename_frame_number.jpg format
    # Create images under directory for that specific source video file name, like left for left1.mp4.
    for i, frame in enumerate(selected_frames):
        print(filename_no_ext)
        file_name = f"{video_filename.split('.')[0].split('/')[-1]}_frame_{i}.jpg"
        print(file_name)
        image_path = os.path.join("dataset", filename_no_ext, file_name)
        print(f"Write to disk. {image_path}")
        print("Resized to 224,224")
        target_height, target_width = 224, 224
        if type(frame) != type(None):
            frame = resize_with_aspect_ratio(frame, target_height, target_width)
            # print(type(frame), frame)
            cv2.imwrite(image_path, frame)
        else:
            continue

    print("Saved images for each all selected frames.")
    return selected_frames


# Resize images.

# Target dimensions for AlexNet

# Resize the image with aspect ratio preservation
def resize_with_aspect_ratio(image, target_height, target_width):
    height, width = image.shape[:2]
    if height == target_height and width == target_width:
        return image
    if height > width:
        new_width = int(width * (target_height / height))
        # resized_image = cv2.resize(image, (new_width, target_height))
        resized_image = cv2.resize(image, (target_width, target_height))
        return resized_image
    else:
        new_height = int(height * (target_width / width))
        resized_image = cv2.resize(image, (target_width, new_height))
        # Crop the center of the resized image to match target dimensions
        start_x = int((resized_image.shape[1] - target_width) / 2)
        start_y = int((resized_image.shape[0] - target_height) / 2)
        return resized_image[start_y:start_y + target_height, start_x:start_x + target_width]


if __name__ == "__main__":
    # Load the image and resize
    BASE_PATH = "dataset/src/"
    videos = os.listdir(BASE_PATH)
    # print(videos)
    target_height, target_width = 224, 224
    for video_file in tqdm(videos):
        selected_frames = video_to_keyframes(os.path.join(BASE_PATH, video_file))

    # image = cv2.imread(image_path)  # Or use your image data
    # resized_image = resize_with_aspect_ratio(image, target_height, target_width)