| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- import os, sys
- import pandas as pd
- import numpy as np
- import sklearn as sk
- from sklearn import preprocessing
- import math
- '''
- coordsi.py is a module for convert coordinates to SI unit.
-
- Warning: This module convert coordinates with heuristic method.
- This moudle will be deprecated
- '''
-
- def readCam (filepath):
- '''
- Create a dataframe from cam*.csv file.
- You must specify camera id. default is 1.
- '''
- try:
- df = pd.read_csv(filepath, header=0, dtype={'x': np.float64, 'y': np.float64, 'z': np.float64, 'frame': np.int64})
- return df
- except Exception as e:
- print(e)
-
- def summaryOriginCoord (root, camid=0):
- '''
- Show brief information of listed surgeon coordinate.
- '''
- d = root
- try:
- if camid == 1 or camid == 2 :
- df = pd.DataFrame(columns=['approx_total_frame', 'x_min', 'x_max', 'y_min', 'y_max', 'z_min', 'z_max'])
- subdirs = [x[0] for x in os.walk(d)]
- for d in subdirs[1:]:
- row = []
- #get a list of files in directory
- files = os.listdir(d)
- count_svo = len([s for s in files if "_1.csv" in s])
- filpath = os.path.join(d,'cam'+str(camid)+'.csv')
- if os.path.isfile(filpath):
- arr = readCam(os.path.join(d,'cam'+str(camid)+'.csv'))
- row = [3600 *count_svo, arr['x'].min(), arr['x'].max(), arr['y'].min(), arr['y'].max(), arr['z'].min(), arr['z'].max()]
- df.loc[d] = row
- else:
- print('Warning: '+filpath+' is not exist.')
- continue
- return df
- else:
- print("Error: Camera ID must be 1 or 2. type camid=1 or camid=2 after dirpath")
- except Exception as e:
- print(e)
-
-
-
-
- def convertToSI (origin, w, l, h):
- '''
- Waring: This function will be deprecated!
- Convert coordinates to SI unit with w, l, h.
- w, l, h are heuristic value. It will be changed after calibration and each surgeon room will geat unique value.
- '''
- try:
- df = origin.copy()
- #normailze dataframe[0] from -1 to 1
- df['x'] = preprocessing.minmax_scale(df['x'], feature_range=(-(w/2), (w/2)), axis=0, copy=True)
- #normailze dataframe[1] from -0.75 to 0.75
- df['y'] = preprocessing.minmax_scale(df['y'], feature_range=(-(l/2), (l/2)), axis=0, copy=True)
- #subtract dataframe[z] from int(4) and normailze from 0.93m to 1.8m (0 as floor)
- df['z'] = h - df['z']
- df['z'] = preprocessing.minmax_scale(df['z'], feature_range=(0.93,1.8), axis=0, copy=True)
- #change column order x, y to y, x
- df = df[['y', 'x', 'z', 'frame']]
- #change column name y to X, x to Y
- df = df.rename(columns={'y': 'x', 'x': 'y'})
- return df
- except Exception as e:
- print(e)
-
- def getVelocity (dataframe):
- try:
- df = dataframe
- df['positionvectorvalue'] = (df['x']**2 + df['y']**2 + df['z']**2)
- buffer1, buffer2 = df['positionvectorvalue'].copy(), df['positionvectorvalue'].copy()
- buffer1, buffer2 = buffer1.to_frame(), buffer2.to_frame()
- buffer1, buffer2 = list(buffer1.loc[:, 'positionvectorvalue']), list(buffer2.loc[:, 'positionvectorvalue'])
- buffer3 = [0.0]
- for x in range(0, len(buffer2)-1):
- buffer3.append(buffer2[x])
- buffer3 = np.array(buffer1) - np.array(buffer3)
- for x in range(0, len(buffer3)):
- buffer3[x] = math.sqrt(abs(buffer3[x]))
- buffer3[0] = 0.0
- df['velocity'] = buffer3
- return df
- except Exception as e:
- print(e)
-
- def getAcceleration (dataframe):
- try:
- df = dataframe
- buffer1, buffer2 = df['velocity'].copy(), df['velocity'].copy()
- buffer1, buffer2 = buffer1.to_frame(), buffer2.to_frame()
- buffer1, buffer2 = list(buffer1.loc[:, 'velocity']), list(buffer2.loc[:, 'velocity'])
- buffer3 = [0.0]
- for x in range(0, len(buffer2)-1):
- buffer3.append(buffer2[x])
- buffer3 = np.array(buffer1) - np.array(buffer3)
- buffer3[1] = 0.0
- df['acceleration'] = buffer3
- return df
- except Exception as e:
- print(e)
-
- def getFullTrace (dataframe, approx_total_frame):
- try:
- df = dataframe
- total_frame = int(approx_total_frame)
- handletrace = pd.DataFrame(columns=['x', 'y', 'z', 'frame', 'positionvectorvalue', 'velocity', 'acceleration', 'isValid'])
- handletrace = pd.concat([handletrace, pd.DataFrame(np.zeros((total_frame,8)), columns=['x', 'y', 'z', 'frame', 'positionvectorvalue','velocity', 'acceleration', 'isValid'])], axis=0)
- for x in range(0, len(df)):
- handletrace.loc[df.loc[x, 'frame']] = df.loc[x]
- handletrace['isValid'] = handletrace['isValid'].fillna(0)
- return handletrace
- except Exception as e:
- print(e)
-
- def addValidDetection (dataframe, threshold = 25.0):
- '''
- threshold value is suitable for only 1st surgeon room(Seoul 801).
- We can make threshold in every surgeon room by using epipolar geometry.(but needs more cameras with different positions)
- '''
- try:
- df = dataframe
- top = threshold
- bottom = -threshold
- for x in range(0, len(df)):
- if bottom < df['acceleration'][x] < top:
- df['isValid'][x] = 1
- else:
- df['isValid'][x] = 0
- return df
- except Exception as e:
- print(e)
|