forked from KwaiVGI/LivePortrait
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cv_coordinate.py
88 lines (66 loc) · 2.22 KB
/
cv_coordinate.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
import cv2
from ffmpeg import FFmpeg
def mouse_callback(event, x, y, flags, param):
global x_start, y_start, x_end, y_end, drawing
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
x_start, y_start = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing:
x_end, y_end = x, y
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if x_end < x_start:
x_start, x_end = x_end, x_start
if y_end < y_start:
y_start, y_end = y_end, y_start
width = x_end - x_start
height = y_end - y_start
print(f"Selection: Top Left: ({x_start}, {y_start}), Width: {width}, Height: {height}")
print("If you want to exit, press 'q'.")
x_start, y_start, x_end, y_end = 0, 0, 0, 0
drawing = False
video_path = input('Please enter the video path: ')
cap = cv2.VideoCapture(video_path)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
cv2.namedWindow("Video", cv2.WINDOW_NORMAL)
cv2.resizeWindow("Video", width, height)
cv2.setMouseCallback("Video", mouse_callback)
while True:
ret, frame = cap.read()
if not ret:
break
if drawing:
cv2.rectangle(frame, (x_start, y_start), (x_end, y_end), (0, 255, 0), 2)
cv2.imshow("Video", frame)
key = cv2.waitKey(25) & 0xFF
if key == ord('q') or key == 27:
break
cap.release()
cv2.destroyAllWindows()
crop = input('Do you want to crop the video using FFmpeg (You need to install FFmpeg at first)? (y/n) ')
if crop == 'y':
while True:
square = input("In order to make the output video a square, please specify the side length. (follow width(w) or height(h))")
try:
assert square in ("w","h")
except AssertionError:
print("Please input a valid option (w/h).")
continue
break
if square == 'h':
length = y_end - y_start
else:
length = x_end - x_start
ffmpeg = (
FFmpeg()
.option("y")
.input(video_path)
.output(
"output.mp4",
{"codec:v": "libx264", "an": None},
vf=f"crop={length}:{length}:{x_start}:{y_start}"
)
)
ffmpeg.execute()