アロハ-Pythonとその他日常

※採点アプリを作成したりしています。

採点アプリを作ろう!【解答用紙に○×△をつける(OpenCV)】

はじめに

採点斬りでは、採点終了後、配点を表示するかわりに〇×△マークがついていませんでした。そこでOpenCVを使って、マークをつけるよう、コードを組んでみました。 採点がすべて完了し、解答用紙の出力まで終わった後に実行します。 完成形
※採点は超絶適当につけています。

コードのおおまかな方針

trimDataから座標を取得し、そこからマークの大きさをきめています。また、○×△はKaitoYoushiフォルダの配点フォルダ情報を取得し、そこから分類して○×△を決めています。

不完全なところ

仮に×なし、〇のみやその逆が起こった場合に対応ができていません。まぁ、あらかじめ、0点の用紙と満点の用紙を用意しておけば、そのようなことは起きないのでいいかなと思っています。 ではコード↓

def Saiten_mark()
    if os.path.exists("./setting/kaitoYousi/saiten"):
        shutil.rmtree("./setting/kaitoYousi/saiten")
    df_zahyo = pd.read_csv("./setting/trimData.csv", index_col=0)
    Jpg_list = os.listdir("./setting/kaitoYousi")
    daimon_list = df_zahyo.index[1:-2]
    df_zahyo = df_zahyo.T

    for jpg in Jpg_list:
    # 画像を読み込む
        img = cv2.imread("./setting/kaitoYousi/" + jpg)
    # 問題番号リストで回す
        for daimon in daimon_list:
    # 問題番号の座標を取得
            x_s,y_s,x_g,y_g=df_zahyo[daimon]
            x= round(x_s+(x_g-x_s)/2)
            y=round(y_s+(y_g-y_s)/2)
    # 大きさによって〇のサイズを変える
            if x_g-x_s < y_g-y_s:
                size = (x_g-x_s)/3
            elif y_g-y_s < x_g-x_s:
                size = (y_g-y_s)/3
    # 大問フォルダの中の配点フォルダ名を取得
            haiten_list=os.listdir("./setting/output/"+daimon)        
    # 0点フォルダは最初
            haiten_0 = haiten_list[0]
    # 0点フォルダのpass
            img_path_0 = daimon +"/"+ haiten_0 + "/" + jpg
    # バツを付ける
            if os.path.exists("./setting/output/" + img_path_0):
                img = cv2.drawMarker(img, (x, y), (255, 0, 0), thickness=8, markerType=cv2.MARKER_TILTED_CROSS, markerSize=int(size))
            else:
                pass
    # 正解フォルダは最後
            haiten_cor = haiten_list[-1]
    # 正解フォルダのpass
            img_path_cor = daimon +"/"+ haiten_cor + "/" + jpg
    # 丸を付ける
            if os.path.exists("./setting/output/" + img_path_cor):
                img = cv2.circle(img, (x, y), int(size), (0, 0, 255), thickness=3, lineType=cv2.LINE_AA)
            else:
                pass
    # もし配点フォルダが2つなら、○×のみなのでpassする。                          
            if len(haiten_list) == 2:
                pass
            else:
                haiten_bubun = haitenlist[1:-1]
                for bubun in haiten_bubun:
                    img_path_bubun = daimon +"/"+ bubun + "/" + jpg
    # 三角を付ける
                    if os.path.exists("./setting/output/" + img_path_bubun):
                        img = cv2.drawMarker(img, (x, y), (0, 255, 0), thickness=3, markerType=cv2.MARKER_TRIANGLE_UP, markerSize=int(size))
                    else:
                        pass    
    # セーブする
        if not os.path.exists("./setting/kaitoYousi/saiten"):
            os.makedirs("./setting/kaitoYousi/saiten")
        cv2.imwrite("./setting/kaitoYousi/saiten"+"/"+ jpg, img)