-
Notifications
You must be signed in to change notification settings - Fork 0
/
submission.py
145 lines (120 loc) · 6.14 KB
/
submission.py
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import cv2
import numpy as np
import os
from callback_function import CallBackFunction
from utility.utility import Utility
# Declare variables
file_path = os.path.abspath(os.getcwd()) + '\greenscreen-asteroid.mp4'
video_window_name = 'Video Output'
cap = cv2.VideoCapture(file_path)
cap_width = int(cap.get(3)) # Get width of video
cap_height = int(cap.get(4)) # Get height of video
# Initialize class objects
debug = Utility(custom_ident_number=1, custom_turn_on_debug=True)
callback = CallBackFunction(file_path, custom_name_of_window=video_window_name)
# Check if camera opened successfully
debug.def_name = 'Before If Loop'
if cap.isOpened() == False:
print("Error opening video stream or file")
# Run call back function
cv2.namedWindow(video_window_name)
cv2.setMouseCallback(video_window_name, callback.press_left_mouse_button_get_x_y_coordinates)
# Create a def that does nothing when trackbar changes
def nothing(x):
pass
# Create a panel with track bar
panel = np.zeros([100, 700, 3], np.uint8) # Creation 100 pixel x 700 pixel 3 dimension of zeros for a black screen
cv2.namedWindow("Panel")
cv2.createTrackbar("Lower Hue", "Panel", 0, 179, nothing)
cv2.createTrackbar("Upper Hue", "Panel", 179, 179, nothing)
cv2.createTrackbar("Lower Saturation", "Panel", 0, 255, nothing)
cv2.createTrackbar("Upper Saturation", "Panel", 255, 255, nothing)
cv2.createTrackbar("Lower Value", "Panel", 0, 255, nothing)
cv2.createTrackbar("Upper Value", "Panel", 255, 255, nothing)
cv2.createTrackbar("Gaussian Pixel", "Panel", 1, 25, nothing)
cv2.createTrackbar("Gaussian Sigma", "Panel", 1, 25, nothing)
# Background Video
background_video_filepath = os.path.abspath(os.getcwd()) + '\\Nebula - 25168.mp4'
background_video_capture = cv2.VideoCapture(background_video_filepath)
#
debug.title = 'class: main def: after if statement'
debug_path = {'cap.isOpened': cap.isOpened(),
'file_path': file_path,
'video_window_name': video_window_name,
'cap_width': cap_width,
'cap_height': cap_height,
'background_video_filepath': background_video_filepath,
'background_video_capture.isOpened': background_video_capture.isOpened()}
debug.print_value_dictionary(debug_path)
frame_counter = 0 # Initialize frame counter for infinite playback
while True:
frame_counter += 1 # Increment frame count
# If the last frame is reached, reset the capture and the frame_counter
if frame_counter == cap.get(cv2.CAP_PROP_FRAME_COUNT):
frame_counter = 0 # Or whatever as long as it is the same as next line
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
# Capture frame-by-frame
ret, frame = cap.read()
get_lower_hue_trackbar_position = cv2.getTrackbarPos("Lower Hue", "Panel")
getl_upper_hue_trackbar_position = cv2.getTrackbarPos("Upper Hue", "Panel")
get_lower_saturation_trackbar_position = cv2.getTrackbarPos("Lower Saturation", "Panel")
getl_upper_saturation_trackbar_position = cv2.getTrackbarPos("Upper Saturation", "Panel")
get_lower_value_trackbar_position = cv2.getTrackbarPos("Lower Value", "Panel")
getl_upper_value_trackbar_position = cv2.getTrackbarPos("Upper Value", "Panel")
get_gaussian_pixel = cv2.getTrackbarPos("Gaussian Pixel", "Panel")
get_gaussian_sigma = cv2.getTrackbarPos("Gaussian Sigma", "Panel")
if get_gaussian_pixel % 2 != 0:
frame = cv2.GaussianBlur(frame, (get_gaussian_pixel, get_gaussian_pixel), get_gaussian_sigma, get_gaussian_sigma)
# Change the color of the frame
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
h_pixel_of_mouse_click = hsv[callback.y, callback.x, 0]
h_pixel = h_pixel_of_mouse_click.item(0)
lower_h_pixel = int(h_pixel) - 10
upper_h_pixel = int(h_pixel) + 10
if callback.leftMouseClick != None:
cv2.setTrackbarPos("Lower Hue", "Panel", lower_h_pixel)
cv2.setTrackbarPos("Upper Hue", "Panel", upper_h_pixel)
callback.leftMouseClick = None
#define lower range and upper range
lower_green_range = np.array([get_lower_hue_trackbar_position, get_lower_saturation_trackbar_position, get_lower_value_trackbar_position])
upper_green_range = np.array([getl_upper_hue_trackbar_position, getl_upper_saturation_trackbar_position, getl_upper_value_trackbar_position])
# Create a Mask
mask = cv2.inRange(hsv, lower_green_range, upper_green_range)
mask_inverse = cv2.bitwise_not(mask)
# Get the background of image
background = cv2.bitwise_and(frame, frame, mask=mask)
foreground = cv2.bitwise_and(frame, frame, mask=mask_inverse)
# Black Out Mask Area and let background show through
mask_of_asteroid = cv2.inRange(frame, lower_green_range, upper_green_range)
mask_of_asteroid_show_asteroid = np.copy(frame)
mask_of_asteroid_show_asteroid[mask_of_asteroid != 0] = 0
# Read background video
background_return, background_frame = background_video_capture.read()
background_frame = cv2.resize(background_frame, (cap_width, cap_height), interpolation=cv2.INTER_AREA)
# Change the color of the frame
#background_frame_hsv = cv2.cvtColor(background_frame, cv2.COLOR_BGR2HSV)
background_frame[mask == 0] = 0
final_complete_frame = background_frame + foreground
debug.title = 'class: main def: while cap.isOpened()'
debug_path = {'callback.x': callback.x,
'callback.y': callback.y,
'video_window_name': video_window_name,
'h_pixel': h_pixel,
'hsv.shape': hsv.shape,
'hsv': hsv}
debug.print_value_dictionary(debug_path)
if ret == True:
# cv2.imshow(video_window_name, frame)
# cv2.imshow("Mask", mask)
# cv2.imshow("Mask of Asteroid", mask_of_asteroid)
# cv2.imshow("Background Frame Mask", background_frame)
cv2.imshow(video_window_name, frame)
# cv2.imshow("Background", background)
cv2.imshow("Final Complete Video", final_complete_frame)
cv2.imshow("Panel", panel)
# Wait for 25 ms before moving on to the next frame
# This will slow down the video
cv2.waitKey(25)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()