def doGet(path, videoName, savePath): import Make_wavedata, clusteringPoint, make_figure, make_fft from pythonFile import make_dirs import os import pickle import shutil print(path) #保存ディレクトリの作成 ''' if not os.path.isdir(savePath + '/cat1/pict'): for i in range(4): os.makedirs(savePath + '/cat' + str(i+1) + '/pict') if not os.path.isdir(savePath + '/fft'): os.makedirs(savePath + '/fft') else: shutil.rmtree(savePath + '/fft') os.makedirs(savePath + '/fft') ''' make_dirs.makeDir(savePath) zahyou = Make_wavedata.todo(path) #オプティカルフローで各特徴点の移動を推定 print(zahyou) zahyou = clusteringPoint.todo(path, zahyou) #手動で分類する make_figure.todo(zahyou, savePath, videoName) #取得した特徴点の動きをグラフにする fft_savepaht = savePath + '/fft' make_fft.doGet(path, zahyou, fft_savepaht, videoName) #取得した特徴点の動きをFFT変換する f = open(savePath + '/pointData_' + videoName + '.txt', 'wb') pickle.dump(zahyou, f)
def doGet(path, videoName, savePath): import Make_wavedata, clusteringPoint, make_figure, make_fft from pythonFile import make_dirs import os import pickle import shutil print(path, videoName, savePath) #保存ディレクトリの作成 make_dirs.makeDir(savePath) zahyou = Make_wavedata.todo(path) #オプティカルフローで各特徴点の移動を推定 print(zahyou) zahyou = clusteringPoint.todo(path, zahyou) #手動で分類する make_figure.todo(zahyou, savePath) #取得した特徴点の動きをグラフにする make_fft.doGet(path, savePath) #取得した特徴点の動きをFFT変換する f = open(savePath + '/pointData_' + videoName + '.txt', 'wb') pickle.dump(zahyou, f)
def doGet(path, videoName, savePath): import Make_wavedata, clusteringPoint, make_figure, make_fft from pythonFile import make_dirs, getVideoData import os import pickle import shutil print(path, videoName, savePath) dirName = getVideoData.getDirName(path) videoName = getVideoData.getVideoName(path) #保存ディレクトリの作成 make_dirs.makeDir(savePath) zahyou = Make_wavedata.todo(path) #オプティカルフローで各特徴点の移動を推定 print(zahyou) if os.path.isdir('/media/koshiba/Data/opticalflow/point_data/' + dirName + '/' + videoName + '/category.txt'): f = open( '/media/koshiba/Data/opticalflow/point_data/' + dirName + '/' + videoName + '/category.txt', 'rb') noise = pickle.load(f) else: noise = clusteringPoint.todo(path, zahyou) #手動で分類する make_figure.todo(zahyou, savePath) #取得した特徴点の動きをグラフにする make_fft.doGet(zahyou, savePath) #取得した特徴点の動きをFFT変換する predList = [[], [], []] accuracy = ['-1', '-1', '-1'] precision = ['-1', '-1', '-1'] recall = ['-1', '-1', '-1'] specificity = ['-1', '-1', '-1'] tmp = 0 for index1, pred in enumerate(zahyou): for index2, answer in enumerate(noise): #print(index1, index2) if (pred[index2] == 0 or pred[index2] == -1): if answer == 0: predList[index1].append(0) else: predList[index1].append(3) else: if answer == 1: predList[index1].append(1) else: predList[index1].append(2) predAll = len(predList[index1]) tp = predList[index1].count(1) tn = predList[index1].count(0) fp = predList[index1].count(2) fn = predList[index1].count(3) print(predAll, tp, tn) accuracy[index1] = str((tp + tn) / predAll) if tp + fp != 0: precision[index1] = str(tp / (tp + fp)) if tp + fn != 0: recall[index1] = str(tp / (tp + fn)) if tn + fp != 0: specificity[index1] = str(tn / (fp + tn)) print(zahyou) #elapsed_time = time.time() - start #print ("elapsed_time:{0}".format(elapsed_time) + "[sec]") print('accuracy:' + accuracy[0] + ' ' + accuracy[1] + ' ' + accuracy[2]) print('precision' + precision[0] + ' ' + precision[1] + ' ' + precision[2]) print('recall' + recall[0] + ' ' + recall[1] + ' ' + recall[2]) print('specificity' + specificity[0] + ' ' + specificity[1] + ' ' + specificity[2]) f = open(savePath + '/pointData_' + videoName + '.txt', 'wb') pickle.dump(zahyou, f)
def todo(path, winsizeNum=15, select_rgb=1, name1='red'): import numpy as np import cv2 import pickle import os from pythonFile import make_dirs p = 10 # 読み込む動画の設定 videoDir = path[:path.rfind('/')] dirName = name1 videoName = path[path.rfind('/') + 1:-4] cap = cv2.VideoCapture(path) print(path) # 動画の設定を読み込み width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = cap.get(cv2.CAP_PROP_FPS) rot = 0 # 動画が横向きならば縦向きに回転させる if width > height: rot = 1 tmp = width width = height height = tmp # Shi-Tomashiのコーナー検出パラメータ feature_params = dict( maxCorners=255, # 保持するコーナー数,int qualityLevel=0.2, # 最良値(最大個数値の割合),double minDistance=7, # この距離内のコーナーを棄却,double blockSize=7, # 使用する近傍領域のサイズ,int useHarrisDetector=False, # FalseならShi-Tomashi法 # k=0.04, # Harris法の測度に使用 ) # Lucas-Kanada法のパラメータ lk_params = dict( winSize=(winsizeNum, winsizeNum), maxLevel=2, #検索を終了する条件 criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03), # 測定値や固有値の使用 flags=cv2.OPTFLOW_LK_GET_MIN_EIGENVALS, ) # 最初のフレームを読み込む ret, first_frame = cap.read() if rot == 1: first_frame = np.rot90(first_frame, -1) print(first_frame) #グレースケール変換 first_gray = cv2.cvtColor(first_frame, cv2.COLOR_BGR2GRAY) # 読み込んだフレームの特徴点を探す prev_points = cv2.goodFeaturesToTrack( image=first_gray[p:-p][p:-p], # 入力画像 mask=None, # mask=0のコーナーを無視 **feature_params) # whileリープで読み込むための準備 old_frame = first_frame old_gray = rgbcut(old_frame, select_rgb) zahyou = prev_points.tolist() # 各フレームの特徴点の座標を入れておく # 2フレーム目以降でオプティカルフローを実行 # zahyou: [x座標, y座標] while True: # 2枚目以降のフレームの読み込み ret, frame = cap.read() if ret == False: break if rot == 1: frame = np.rot90(frame, -1) # グレースケール変換 #frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) frame_gray = rgbcut(frame, select_rgb) #オプティカルフロー(正確には対応点)の検出 # next_points: 検出した対応点, numpy.ndarray # status: 各店において,見つかれば1(True),見つからなければ0(False), numpy.ndarray # err: 検出した点の誤差, numpy.ndarray next_points, status, err = cv2.calcOpticalFlowPyrLK( prevImg=old_gray[p:-p][p:-p], # 前の画像(t-1) nextImg=frame_gray[p:-p][p:-p], # 次の画像(t) prevPts=prev_points, # 始点2次元ベクトル,特徴点やそれに準ずる店 nextPts=None, # 結果の2次元ベクトル **lk_params) # 正しく特徴点と対応点が検出できた点のみに絞る # todo: 数フレームおきに特徴点を検出しなおさないと,対応点がなくなるのでエラーになります good_new = next_points[status == 1] good_old = prev_points[status == 1] # 対応点の是票を保存 for rank, (prev_p, next_p) in enumerate(zip(good_old, good_new)): # x,y座標の取り出し # prev_x, prev_y: numpy.float32 # next_x, next_y: numpy.float32 prev_x, prev_y = prev_p.flatten() next_x, next_y = next_p.flatten() # 座標保存 zahyou[rank].append([next_x, next_y]) # 次のフレームを読み込む準備 old_gray = frame_gray.copy() prev_points = good_new.reshape(-1, 1, 2) print(dirName, videoName) if not os.path.isdir('/media/koshiba/Data/opticalflow/point_data/' + dirName + '/' + videoName + '/' + str(winsizeNum)): make_dirs.makeDir('/media/koshiba/Data/opticalflow/point_data/' + dirName + '/' + videoName + '/' + str(winsizeNum)) f = open( '/media/koshiba/Data/opticalflow/point_data/' + dirName + '/' + videoName + '/' + str(winsizeNum) + '/pointData_' + videoName + '.txt', "wb") pickle.dump(np.array(zahyou), f) return zahyou
videoDir = path[:path.rfind('/')] videolist = glob.glob(path[:path.find(videoName)] + "/*") print(fileName) print('Process all the files? (yes, no) :', end=" ") flag = input() print('select windowsize:') winsize = list(map(str, input().split())) if flag == 'yes': for i in videolist: videoName = i[i.rfind('/') + 1:] if not os.path.isdir(i + '/video'): make_dirs.makeDir(i) for ws in winsize: savepath = i + '/video' path = i + '/winsize/winsize_' + ws + '/pointData_' + videoName + '.txt' dataName = path[path.rfind('/') + 1:-4] videoPath = path[:path.find( '/opticalflow' )] + '/video/yohaku/' + dirName + '/' + videoName + '.avi' print(savepath, path, videoPath) if os.path.isdir(i + '/winsize'): doGet(path, savepath, videoPath, ws) else: for ws in winsize:
if flag == 'yes': # すべての動画で実行する for i in videolist: # 動画名とディレクトリ名を取得 dirName = getVideoData.getDirName(i) videoName = getVideoData.getVideoName(i) videoPath = '/media/koshiba/Data/video/yohaku/' + dirName + '/' + videoName + '.avi' print(videoPath) # 選択された動画の解析が終わっていれば実行 if os.path.exists(videoPath): for num in range(5, 41): # windowSizeを5~40で実行 if not os.path.isdir(i + 'window_' + str(num) + '/cat4/toFirstErrorFFT'): make_dirs.makeDir(i[:-1] + '/winsize/winsize_' + str(num)) # 保存するフォルダがなければ作成 savePath = i + 'winsize/winsize_' + str(num) # 保存先のPATH zahyou = Make_wavedata.todo( videoPath, num) # 動画を解析する(時間はかかるけど毎回動画を読み込む),特徴点の各フレームにおける座標を取得 make_figure.todo( zahyou, savePath) # 各特徴点の各波形(vec, error, toFirstError)を取得 make_fft.doGet( zahyou, savePath) # 各波形のFFT解析(toFirstFFT, toFirstErrorFFT) else: error.append(videoName) print("Could not be executed:" + error) else: