Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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
Exemplo n.º 5
0
    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:
Exemplo n.º 6
0
    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: