Пример #1
0
def todo(path):
    import numpy as np
    import cv2
    from pythonFile import click_pct
    import os

    padding = 10  # 特徴点検出領域の半径

    # 読み込む動画の設定
    videoName = path[path.rfind('/') + 1:]
    cap = cv2.VideoCapture(path)
    print(videoName)

    # 動画の設定
    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

    print(videoName[:-4])

    # 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法の測度に使用
    )

    # 最初のフレームを読み込む
    ret, first_frame = cap.read()
    if rot == 1:
        first_frame = np.rot90(first_frame, -1)

    #グレースケール変換
    first_gray = cv2.cvtColor(first_frame, cv2.COLOR_BGR2GRAY)

    # 読み込んだフレームの特徴点を探す
    prev_points = cv2.goodFeaturesToTrack(
        image=first_gray,  # 入力画像
        mask=None,  # mask=0のコーナーを無視
        **feature_params)
    flow_layer = np.zeros_like(first_frame)
    # 一度すべての点をノイズとする
    noise = [0] * len(prev_points)
    hozon = noise

    for i in prev_points:
        flow_layer = cv2.circle(
            flow_layer,  # 描く画像
            (int(i[0][0]), int(i[0][1])),  # 線を引く始点
            2,  # 線を引く終点
            color=(0, 0, 255),  # 描く色
            thickness=3  # 線の太さ
        )
    frame = cv2.add(first_frame, flow_layer)

    #######################################
    # クリックした特徴点を正常な特徴点とする
    #######################################
    while True:
        # クリックした座標を保存
        points = np.array(click_pct.give_coorList(frame), dtype='int')
        # クリックした座標の周囲の点を正常な特徴点とする
        for p in points:
            area = [
                p[0] - padding, p[0] + padding, p[1] - padding, p[1] + padding
            ]
            for index, prev in enumerate(prev_points):
                if (noise[index] == 0) and (area[0] <= int(prev[0][0])) and (
                        area[1] >= int(prev[0][0])) and (area[2] <= int(
                            prev[0][1])) and (area[3] >= int(prev[0][1])):
                    noise[index] = 1
                    print(10)
                    break

        flow_layer2 = np.zeros_like(first_frame)
        for index, prev in enumerate(prev_points):
            if noise[index] == 0:
                flow_layer2 = cv2.circle(
                    flow_layer2,  # 描く画像
                    (int(prev[0][0]), int(prev[0][1])),  # 線を引く始点
                    5,  # 線を引く終点
                    color=(255, 0, 0),  # 描く色
                    thickness=3  # 線の太さ
                )
            elif noise[index] == 1:
                flow_layer2 = cv2.circle(
                    flow_layer2,  # 描く画像
                    (int(prev[0][0]), int(prev[0][1])),  # 線を引く始点
                    5,  # 線を引く終点
                    color=(0, 0, 255),  # 描く色
                    thickness=3  # 線の太さ
                )
        frame2 = cv2.add(first_frame, flow_layer2)
        if noise == hozon:
            break
        hozon = noise

    # 結果画像の表示
    cv2.namedWindow("frame", cv2.WINDOW_NORMAL)
    cv2.imshow("frame", frame2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    cv2.imwrite(
        'D:/opticalflow/evaluation/result/' + str(videoName[:-4]) +
        '_Original.jpg', frame2)

    return noise
Пример #2
0
def todo(path, zahyou):
    import numpy as np
    import cv2
    from pythonFile import click_pct, getVideoData
    import os
    import pickle

    padding = 10  # 特徴点検出領域の半径
    p = 10
    winsize = 25
    c = [[255, 0, 0], [0, 0, 255], [0, 255, 0], [0, 255, 255]]  # 特徴点の色
    selectDir = ['cat1', 'cat2', 'cat3', 'cat4']

    # 読み込む動画の設定
    videoDir = path[:path.rfind('/')]
    dirName = getVideoData.getDirName(path)
    videoName = getVideoData.getVideoName(path)
    savePath = '/media/koshiba/Data/opticalflow/point_data/' + dirName + '/' + videoName
    cap = cv2.VideoCapture(path)
    print(path[path.rfind('/') + 1:])

    # 動画の設定
    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

    print(videoName)

    # 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法の測度に使用
    )

    # 最初のフレームを読み込む
    ret, first_frame = cap.read()
    if rot == 1:
        first_frame = np.rot90(first_frame, -1)

    #グレースケール変換
    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)
    flow_layer = np.zeros_like(first_frame)
    # 一度すべての点をノイズとする
    noise = [0] * len(prev_points)

    for i in prev_points:
        flow_layer = cv2.circle(
            flow_layer,  # 描く画像
            (int(i[0][0]), int(i[0][1])),  # 線を引く始点
            2,  # 線を引く終点
            color=c[0],  # 描く色
            thickness=3  # 線の太さ
        )
    frame = cv2.add(first_frame, flow_layer)
    save_layer_list = [np.zeros_like(first_frame)] * len(zahyou)
    selectDirList = ['/cat1/'] * len(zahyou)

    #######################################
    # クリックした特徴点を正常な特徴点とする
    #######################################
    while True:
        # クリックした座標を保存
        ret, points = click_pct.give_coorList(frame)
        points = np.array(points, dtype='int')
        # クリックした座標の周囲の点を正常な特徴点とする
        for p in points:
            area = [
                p[0] - padding, p[0] + padding, p[1] - padding, p[1] + padding
            ]
            for index, prev in enumerate(prev_points):
                if (area[0] <= int(prev[0][0])) and (area[1] >= int(
                        prev[0][0])) and (area[2] <= int(
                            prev[0][1])) and (area[3] >= int(prev[0][1])):
                    if (noise[index] == 0):
                        noise[index] = 1
                        #break
                    elif (noise[index] == 1):
                        noise[index] = 2
                        #break
                    elif (noise[index] == 2):
                        noise[index] = 3
                        #break
                    elif (noise[index] == 3):
                        noise[index] = 0
                        #break

        # 特徴点を描画するlayer
        cat1_layer = np.zeros_like(first_frame)
        cat2_layer = np.zeros_like(first_frame)
        cat3_layer = np.zeros_like(first_frame)
        cat4_layer = np.zeros_like(first_frame)

        for index, prev in enumerate(prev_points):
            save_layer = np.zeros_like(first_frame)
            save_layer_list[index] = cv2.circle(
                save_layer,  # 描く画像
                (int(prev[0][0]), int(prev[0][1])),  # 線を引く始点
                5,  # 線を引く終点
                color=c[noise[index]],  # 描く色
                thickness=3  # 線の太さ
            )
            if noise[index] == 0:

                selectDirList[index] = '/cat1/'
                cat1_layer = cv2.circle(
                    cat1_layer,  # 描く画像
                    (int(prev[0][0]), int(prev[0][1])),  # 線を引く始点
                    5,  # 線を引く終点
                    color=c[noise[index]],  # 描く色
                    thickness=3  # 線の太さ
                )
            elif noise[index] == 1:
                selectDirList[index] = '/cat2/'
                cat2_layer = cv2.circle(
                    cat2_layer,  # 描く画像
                    (int(prev[0][0]), int(prev[0][1])),  # 線を引く始点
                    5,  # 線を引く終点
                    color=c[noise[index]],  # 描く色
                    thickness=3  # 線の太さ
                )
            elif noise[index] == 2:
                selectDirList[index] = '/cat3/'
                cat3_layer = cv2.circle(
                    cat3_layer,  # 描く画像
                    (int(prev[0][0]), int(prev[0][1])),  # 線を引く始点
                    5,  # 線を引く終点
                    color=c[noise[index]],  # 描く色
                    thickness=3  # 線の太さ
                )
            elif noise[index] == 3:
                selectDirList[index] = '/cat4/'
                cat4_layer = cv2.circle(
                    cat4_layer,  # 描く画像
                    (int(prev[0][0]), int(prev[0][1])),  # 線を引く始点
                    5,  # 線を引く終点
                    color=c[noise[index]],  # 描く色
                    thickness=3  # 線の太さ
                )

        # フレームに特徴点layerを追加する
        frame = cv2.add(first_frame, cat1_layer)
        frame = cv2.add(frame, cat2_layer)
        frame = cv2.add(frame, cat3_layer)
        frame = cv2.add(frame, cat4_layer)
        layer_list = [cat1_layer, cat2_layer, cat3_layer, cat4_layer]
        if ret == 1:
            break

    # 結果画像の表示
    # cv2.namedWindow("frame", cv2.WINDOW_NORMAL)
    # cv2.imshow("frame", frame)
    # cv2.waitKey(0)
    cv2.destroyAllWindows()
    cv2.imwrite(savePath + '/' + videoName + '.jpg', frame)

    # 分類結果の画像を保存する
    for n, layer in enumerate(layer_list):
        frame = cv2.add(first_frame, layer)
        cv2.imwrite(
            savePath + '/' + selectDir[n] + '/' + videoName + '_' +
            selectDir[n] + '.jpg', frame)

    for index in range(len(zahyou)):
        save_frame = cv2.add(first_frame, save_layer_list[index])
        cv2.imwrite(
            savePath + '/' + selectDirList[index] + '/pict/' + videoName +
            '_' + str(index + 1) + '.jpg', save_frame)

    category = np.array(noise)
    print(path[:path.find('/video')] + "/opticalflow/point_data/" + dirName +
          '/' + videoName + '/category.txt')

    f = open(
        path[:path.find('/video')] + "/opticalflow/point_data/" + dirName +
        '/' + videoName + '/category.txt', "wb")
    pickle.dump(category, f)

    return zahyou
Пример #3
0
def todo(path):
    import numpy as np
    import cv2
    from pythonFile import click_pct
    import pickle
    import os

    padding = 5  # 特徴点検出領域の半径
    save_path = 'E:/data/click_point/nda/output'

    # 読み込む動画の設定
    path = path.replace(os.sep, '/')
    videoName = path.split('/')[-1][:path.split('/')[-1].rfind('.')]
    videoDir = path.split('/')[-2]
    cap = cv2.VideoCapture(path)
    print(videoName)

    # 動画の設定
    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

    print(videoName[:-4])

    # 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法の測度に使用
    )

    # 最初のフレームを読み込む
    ret, first_frame = cap.read()
    if rot == 1:
        first_frame = np.rot90(first_frame, -1)

    #グレースケール変換
    first_gray = cv2.cvtColor(first_frame, cv2.COLOR_BGR2GRAY)

    # 読み込んだフレームの特徴点を探す
    prev_points = cv2.goodFeaturesToTrack(
        image=first_gray,  # 入力画像
        mask=None,  # mask=0のコーナーを無視
        **feature_params)
    flow_layer = np.zeros_like(first_frame)
    # 一度すべての点をノイズとする
    noise = [0] * len(prev_points)
    hozon = noise

    for i in prev_points:
        flow_layer = cv2.circle(
            flow_layer,  # 描く画像
            (int(i[0][0]), int(i[0][1])),  # 線を引く始点
            2,  # 線を引く終点
            color=(0, 0, 255),  # 描く色
            thickness=3  # 線の太さ
        )
    frame = cv2.add(first_frame, flow_layer)
    frame = cv2.resize(frame, (720, 1280))

    #######################################
    # クリックした特徴点を正常な特徴点とする
    #######################################

    while True:
        # クリックした座標を保存
        ret, points = click_pct.give_coorList(frame)
        points = np.array(points, dtype='int')
        # クリックした座標の周囲の点を正常な特徴点とする
        for p in points:
            area = [
                p[0] - padding, p[0] + padding, p[1] - padding, p[1] + padding
            ]
            for index, prev in enumerate(prev_points):
                if (area[0] <= int(prev[0][0])) and (area[1] >= int(
                        prev[0][0])) and (area[2] <= int(
                            prev[0][1])) and (area[3] >= int(prev[0][1])):
                    if noise[index] == 0:
                        noise[index] = 1
                    elif noise[index] == 1:
                        noise[index] = 0

        flow_layer2 = np.zeros_like(first_frame)
        for index, prev in enumerate(prev_points):
            if noise[index] == 0:
                flow_layer2 = cv2.circle(
                    flow_layer2,  # 描く画像
                    (int(prev[0][0]), int(prev[0][1])),  # 線を引く始点
                    5,  # 線を引く終点
                    color=(0, 0, 255),  # 描く色
                    thickness=3  # 線の太さ
                )
            elif noise[index] == 1:
                flow_layer2 = cv2.circle(
                    flow_layer2,  # 描く画像
                    (int(prev[0][0]), int(prev[0][1])),  # 線を引く始点
                    5,  # 線を引く終点
                    color=(255, 0, 0),  # 描く色
                    thickness=3  # 線の太さ
                )
        frame = cv2.add(first_frame, flow_layer2)
        if ret == 1:
            break

    # 結果画像の表示
    #cv2.namedWindow("frame", cv2.WINDOW_NORMAL)
    #cv2.imshow("frame", frame)
    #cv2.waitKey(0)
    cv2.destroyAllWindows()
    category = np.array(noise)
    if not os.path.exists(save_path + '/' + videoDir):
        os.makedirs(save_path + '/' + videoDir)
    cv2.imwrite(
        save_path + '/' + videoDir + '/' + str(videoName) + '_Original.jpg',
        frame)
    #with open(save_path + '/' + videoDir + '_' + str(videoName) + '.pickle', 'wb') as f:
    #    pickle.dump(category, f)
    with open(save_path + '/' + str(videoName) + '.pickle', 'wb') as f:
        pickle.dump(category, f)

    return noise