-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathget_data.py
61 lines (43 loc) · 1.65 KB
/
get_data.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
import cv2 as cv
pixel_to_cm = 9/27550 # relação de cm/pixel (considerando que o penulo foi solto de um ângulo inicial de aprox 10 graus)
# a massa utilizada tinha aproximadamente 102g e o comprimento do pendulo era de aproximadamente 52cm
def binarize(image):
image = cv.cvtColor(image, cv.COLOR_BGR2GRAY) # converte o frame pra grayscale
image = cv.medianBlur(image, 5) # tira pontos brancos
image = cv.threshold(image, 100, 255, cv.THRESH_BINARY_INV)[1] # binariza
return image
def center_of_mass(image):
M = cv.moments(image)
cX = int(M["m10"] / M["m00"]) # calculo da coordenada x do centro de massa
return cX
def get_frame(sec):
vidcap = cv.VideoCapture('video.mp4')
vidcap.set(cv.CAP_PROP_POS_MSEC, sec*1000)
has_frames, image = vidcap.read() # pega um frame do video
if has_frames: # se o video ainda não tiver acabado
image = binarize(image)
cX = center_of_mass(image)
write_time(sec)
write_pos(cX)
return has_frames
def write_time(sec):
dados_tempo = open('./output/tempos.txt', 'a')
dados_tempo.write(f'{sec}\n')
dados_tempo.close()
def write_pos(pos):
dados_espaciais = open('./output/espacos.txt', 'a')
dados_espaciais.write(f'{pos*pixel_to_cm}\n') # conversao da unidade de medida da posicao de pixel para cm (baseada nos dados experimentais)
dados_espaciais.close()
def expand_video():
sec = 0
frame_rate = round(1/30, 2) # 30 fps
success = get_frame(sec)
while success:
sec += frame_rate
sec = round(sec, 2)
success = get_frame(sec)
def main():
expand_video()
pass
if __name__ == "__main__":
main()