Skip to content

Instantly share code, notes, and snippets.

@smeschke
Created November 1, 2018 18:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save smeschke/15b7514991f217a36b7707d80f80a8db to your computer and use it in GitHub Desktop.
Save smeschke/15b7514991f217a36b7707d80f80a8db to your computer and use it in GitHub Desktop.
OpenCV gui to manually fit sine waves
import cv2, math
import numpy as np
import pandas as pd
import scipy
from sklearn import preprocessing
from scipy import signal
import matplotlib.pyplot as plt
#read tracking data from file
distances = []
#get pose data - data is generated by open pose video
#df = pd.read_csv('/home/stephen/Desktop/source_data/ss552_id_91.csv')
df = pd.read_csv('/home/stephen/Desktop/source_data/ss423_id_17.csv')
df = pd.read_csv('/home/stephen/Desktop/source_data/ss3_id_16.csv')
#smooth it out
smoothed_data = []
window_length, polyorder = 27, 2
for i in range(int(len(df.columns)/2)):
x = signal.savgol_filter(df[df.columns[i*2]], window_length, polyorder)
y = signal.savgol_filter(df[df.columns[i*2+1]], window_length, polyorder)
smoothed_data.append(list(zip(x,y)))
smoothed_data = np.array(smoothed_data, int)
y = pd.DataFrame(y)
min_max_scaler = preprocessing.MinMaxScaler()
np_scaled = min_max_scaler.fit_transform(y)
y = pd.DataFrame(np_scaled)
y = y.values*100
z = []
for i in range(len(y)): z.append(i)
z = np.array(z)
end = 1017
start = 0
y = y[start:end]
y = y+550
z = z[start:end]
# y = (sin((x+phase)/period) * amplitude) +
period = .10
amplitude = 0
mean = 0
phase = 0
period1 = .10
amplitude1 = 0
mean1 = 0
phase1 = 0
first_wave = True
def get_y(amplitude, period, mean, phase,amplitude1, period1, mean1, phase1, i):
xx = (math.sin((i+phase)/period)*amplitude + mean) + (math.sin((i+phase1)/period1)*amplitude1 + mean1)
return int(xx)
def get_y_single(amplitude, period, mean, phase, i):
xx = (math.sin((i+phase)/period)*amplitude + mean)
return int(xx)
while True:
img = np.zeros((int(max(y))+150,end,3), np.uint8)
img[:,:,:] = 123,123,123
for i in range(len(y)-1):
a = i, int(y[i])
b = i+1, int(y[i+1])
cv2.line(img, a, b, (255,0,0), 8)
for i in range(end):
a = i, get_y(amplitude, period, mean, phase,amplitude1, period1, mean1, phase1, i)
b = i+1, get_y(amplitude, period, mean, phase,amplitude1, period1, mean1, phase1, i+1)
cv2.line(img, a, b, (0, 255,0), 4)
for i in range(end):
a = i, get_y_single(amplitude, period, mean, phase, i)
b = i+1, get_y_single(amplitude, period, mean,phase, i+1)
cv2.line(img, a, b, (255, 255,0), 2)
for i in range(end):
a = i, get_y_single(amplitude1, period1, mean1, phase1, i)
b = i+1, get_y_single(amplitude1, period1, mean1, phase1, i+1)
cv2.line(img, a, b, (0, 255,255), 2)
img = cv2.resize(img, (800,800))
cv2.imshow('img', img)
k = cv2.waitKey(0)
if k == 27: break
#print (amplitude, period, k)
if k == 115:
if first_wave: first_wave = False
else: first_wave = True
if first_wave:
if k == 180: period += .1
if k == 182: period -= .1
if period<=0: period = .51
if k == 183: amplitude += .51
if k == 185: amplitude -= .51
if k == 184: mean -= 5
if k == 178: mean += 5
if k == 179: phase -= 1
if k == 177: phase += 1
else:
if k == 180: period1 += .1
if k == 182: period1 -= .1
if period1<=0: period1 = .51
if k == 183: amplitude1 += .51
if k == 185: amplitude1 -= .51
if k == 184: mean1 -= 5
if k == 178: mean1 += 5
if k == 179: phase1 -= 1
if k == 177: phase1 += 1
print(period, period1)
period1 = period/2
cv2.destroyAllWindows()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment