Init
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.tsv
|
||||||
BIN
data/curl.mp4
Normal file
BIN
data/curl.mp4
Normal file
Binary file not shown.
BIN
data/press.mp4
Normal file
BIN
data/press.mp4
Normal file
Binary file not shown.
BIN
data/situp.mp4
Normal file
BIN
data/situp.mp4
Normal file
Binary file not shown.
110
main.py
Normal file
110
main.py
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
import numpy as np
|
||||||
|
import cv2
|
||||||
|
import datetime
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import matplotlib
|
||||||
|
|
||||||
|
matplotlib.use('WebAgg')
|
||||||
|
scale = 2
|
||||||
|
max_count = 1088*1920*255
|
||||||
|
|
||||||
|
def processVideo(path):
|
||||||
|
prev_gray = None
|
||||||
|
data = []
|
||||||
|
cap = cv2.VideoCapture(path)
|
||||||
|
alpha = 0.90
|
||||||
|
posx = 0.0
|
||||||
|
posy = 0.0
|
||||||
|
posxs = []
|
||||||
|
posys = []
|
||||||
|
counts = []
|
||||||
|
while True:
|
||||||
|
ret, src = cap.read()
|
||||||
|
if not ret:
|
||||||
|
print(ret)
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
smol = cv2.resize(
|
||||||
|
src, (int(src.shape[1]/scale), int(src.shape[0]/scale)))
|
||||||
|
gray = cv2.cvtColor(smol, cv2.COLOR_BGR2GRAY)
|
||||||
|
|
||||||
|
if prev_gray is not None:
|
||||||
|
diff = cv2.absdiff(gray, prev_gray)
|
||||||
|
blur = cv2.GaussianBlur(diff, (5,5),0)
|
||||||
|
retval, thresh = cv2.threshold(blur, 50, 255, cv2.THRESH_TOZERO)
|
||||||
|
cv2.imshow("thresh", thresh)
|
||||||
|
count = np.sum(thresh)/max_count * 100.0
|
||||||
|
if count > 0.001 and count < 0.1:
|
||||||
|
moments = cv2.moments(thresh)
|
||||||
|
cX = int(moments["m10"] / moments["m00"])
|
||||||
|
cY = int(moments["m01"] / moments["m00"])
|
||||||
|
posx = posx * alpha + cX * (1.0-alpha)
|
||||||
|
posy = posy * alpha + cY * (1.0-alpha)
|
||||||
|
posxs.append(posx)
|
||||||
|
posys.append(posy)
|
||||||
|
counts.append(count)
|
||||||
|
|
||||||
|
cv2.putText(smol, "{:.2}".format(count), (20, 50),
|
||||||
|
cv2.FONT_HERSHEY_COMPLEX, 1, (255, 0, 0), 2)
|
||||||
|
i = 0
|
||||||
|
while i < len(posxs):
|
||||||
|
blue_color = 0
|
||||||
|
if counts[i] > 0.01:
|
||||||
|
blue_color = 255
|
||||||
|
else:
|
||||||
|
blue_color = counts[i]/0.01 * 255
|
||||||
|
|
||||||
|
cv2.circle(smol, (int(posxs[i]), int(posys[i])), 10, (blue_color,0,0),6)
|
||||||
|
i+= 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if count > 0.1:
|
||||||
|
count = 0.1
|
||||||
|
data.append(count)
|
||||||
|
|
||||||
|
cv2.imshow("src", smol)
|
||||||
|
prev_gray = np.copy(gray)
|
||||||
|
|
||||||
|
key = cv2.waitKey(10)
|
||||||
|
if key == 27:
|
||||||
|
break
|
||||||
|
cap.release()
|
||||||
|
cv2.destroyAllWindows()
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
out = open("data.tsv", "w+")
|
||||||
|
data1 = processVideo("data/curl.mp4")
|
||||||
|
data2 = processVideo("data/press.mp4")
|
||||||
|
data3 = processVideo("data/situp.mp4")
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
max_length = 0
|
||||||
|
if len(data1) > max_length:
|
||||||
|
max_length = len(data1)
|
||||||
|
if len(data2) > max_length:
|
||||||
|
max_length = len(data2)
|
||||||
|
if len(data3) > max_length:
|
||||||
|
max_length = len(data3)
|
||||||
|
|
||||||
|
while i < max_length:
|
||||||
|
d1 = 0
|
||||||
|
try:
|
||||||
|
d1 = data1[i]
|
||||||
|
except:
|
||||||
|
print("")
|
||||||
|
d2 = 0
|
||||||
|
try:
|
||||||
|
d2 = data2[i]
|
||||||
|
except:
|
||||||
|
print("")
|
||||||
|
d3 = 0
|
||||||
|
try:
|
||||||
|
d3 = data3[i]
|
||||||
|
except:
|
||||||
|
print("")
|
||||||
|
out.write("{}\t{}\t{}\n".format(d1, d2, d3))
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
out.close()
|
||||||
33
plot.py
Normal file
33
plot.py
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import matplotlib
|
||||||
|
import pandas as pd
|
||||||
|
import numpy as np
|
||||||
|
from scipy.signal import savgol_filter
|
||||||
|
import scipy.signal as signal
|
||||||
|
import sys
|
||||||
|
df = pd.read_csv(sys.argv[1],delimiter="\t")
|
||||||
|
target = sys.argv[2]
|
||||||
|
time_size = 5
|
||||||
|
window = time_size * 30 + 1
|
||||||
|
|
||||||
|
def reject_outliers(data,indicies, m = 2.):
|
||||||
|
d = np.abs(data - np.median(data))
|
||||||
|
mdev = np.median(d)
|
||||||
|
s = d/mdev if mdev else 0.
|
||||||
|
return (data[s<m],indicies[s<m])
|
||||||
|
|
||||||
|
xhat = savgol_filter(df[target].array.to_numpy(),window,3)
|
||||||
|
indexs = np.arange(len(xhat))
|
||||||
|
xhat,xs = reject_outliers(xhat,indexs,m=1.5)
|
||||||
|
indicies = signal.argrelextrema(xhat, np.less,order=int(window/2))[0]
|
||||||
|
|
||||||
|
plt.plot(df[target])
|
||||||
|
plt.plot(xs,xhat,color="green")
|
||||||
|
plt.plot(xs[indicies],xhat[indicies],marker="o", ls="", ms=3 )
|
||||||
|
|
||||||
|
value1 = np.median(xhat)
|
||||||
|
print(np.median(xhat))
|
||||||
|
# value2 = np.percentile(xhat, 75)
|
||||||
|
plt.plot([0,len(df[target])],[value1,value1],color="purple")
|
||||||
|
#plt.plot([0,len(xhat)],[value2,value2])
|
||||||
|
plt.show()
|
||||||
86
process.py
Normal file
86
process.py
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
import numpy as np
|
||||||
|
import cv2
|
||||||
|
import math
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Init
|
||||||
|
target = sys.argv[1]
|
||||||
|
cap = cv2.VideoCapture("data/{}.mp4".format(target))
|
||||||
|
cap.set(cv2.CAP_PROP_FPS,240)
|
||||||
|
out = open("{}.tsv".format(target),"w+")
|
||||||
|
out.write("Time\tX\tY\tCount\tVelocity\n")
|
||||||
|
|
||||||
|
# Image Processing
|
||||||
|
scale = 16.0
|
||||||
|
diff_thresh = 50
|
||||||
|
blur_kernel = (7,7)
|
||||||
|
|
||||||
|
# Background
|
||||||
|
bg_alpha = 0.99
|
||||||
|
bg = None
|
||||||
|
bg_float = None
|
||||||
|
|
||||||
|
# Position
|
||||||
|
pos_alpha = 0.99
|
||||||
|
posx = 0.0
|
||||||
|
posy = 0.0
|
||||||
|
|
||||||
|
# Count
|
||||||
|
running_count = 0.0
|
||||||
|
|
||||||
|
# Main Loop
|
||||||
|
frame_number = 0
|
||||||
|
|
||||||
|
while True:
|
||||||
|
# Grab Frame
|
||||||
|
ret, src = cap.read()
|
||||||
|
if not ret:
|
||||||
|
break
|
||||||
|
|
||||||
|
# Ensmallen and grayen
|
||||||
|
blur = cv2.GaussianBlur(src, blur_kernel,0)
|
||||||
|
smol = cv2.resize(blur, (int(src.shape[1]/scale), int(src.shape[0]/scale)))
|
||||||
|
gray = cv2.cvtColor(smol, cv2.COLOR_BGR2GRAY)
|
||||||
|
if bg is None:
|
||||||
|
bg = gray
|
||||||
|
bg_float = np.zeros(gray.shape,dtype=np.float32)
|
||||||
|
|
||||||
|
# Get Difference
|
||||||
|
diff = cv2.absdiff(gray, bg)
|
||||||
|
retval, thresh = cv2.threshold(diff, diff_thresh, 255, cv2.THRESH_TOZERO)
|
||||||
|
|
||||||
|
# Normalize Count
|
||||||
|
count = np.sum(thresh)/(smol.shape[0]*smol.shape[1]*255)
|
||||||
|
|
||||||
|
# Process Count
|
||||||
|
if count > 0.0:
|
||||||
|
moments = cv2.moments(thresh)
|
||||||
|
cX = (moments["m10"] / moments["m00"])/smol.shape[1]
|
||||||
|
cY = (moments["m01"] / moments["m00"])/smol.shape[0]
|
||||||
|
prevx = posx
|
||||||
|
prevy = posy
|
||||||
|
posx = posx * pos_alpha + cX * (1.0-pos_alpha)
|
||||||
|
posy = posy * pos_alpha + cY * (1.0-pos_alpha)
|
||||||
|
velocity = math.sqrt((prevx-posx) * (prevx-posx) + (prevy - posy) * (prevy - posy))
|
||||||
|
running_count = running_count * pos_alpha + count * (1.0 - pos_alpha)
|
||||||
|
out.write("{}\t{}\t{}\t{}\t{}\n".format(frame_number/30.0,posx,posy,running_count,velocity))
|
||||||
|
|
||||||
|
# Calculate new BG
|
||||||
|
bg_float = bg_float * bg_alpha + gray * (1.0 - bg_alpha)
|
||||||
|
bg = bg_float.astype(np.uint8)
|
||||||
|
|
||||||
|
# Draw
|
||||||
|
#cv2.circle(smol, (int(posx*smol.shape[1]), int(posy*smol.shape[0])), 3, (255,0,0),6)
|
||||||
|
|
||||||
|
# Show Results
|
||||||
|
# cv2.imshow("thresh", cv2.resize(thresh, (int(src.shape[1]/2.0), int(src.shape[0]/2.0))))
|
||||||
|
# cv2.imshow("smol", cv2.resize(smol, (int(src.shape[1]/2.0), int(src.shape[0]/2.0))))
|
||||||
|
# key = cv2.waitKey(1)
|
||||||
|
# if key == 27:
|
||||||
|
# break
|
||||||
|
|
||||||
|
frame_number += 1
|
||||||
|
print(frame_number)
|
||||||
|
|
||||||
|
cap.release()
|
||||||
|
cv2.destroyAllWindows()
|
||||||
Reference in New Issue
Block a user