画像認識を利用しためり込みチェック

画像1

たとえば上記の様な連番のうち、2F目にめり込み部分があり、ここを直さなければいけません。
4F程度なら目視で確認できますがこれが数千フレームとなった場合、人力では気が遠くなる作業になりますね。
地道に手作業では時間がもったいないので「退屈なことはPythonにやらせよう」ということでコード化しましょう。

○検出方法を考える
まずはスクリプトによるエラー個所の検出方法を考えてみます。
初めに思いつくのはポリゴン同士の干渉を計算する方法、これは精度は高そうですがコードが複雑になりそうな予感。
今回は考え方を変えて、見えてはいけない部分が描画されているかどうか?という方向でいこうとおもいます。
下図のようにNG部分のみ赤、他の部分は黒く描画されるようにして
画像内に赤成分が含まれていたらエラーとして検出するという処理内容にしました。

画像2

○コード内容
Googleで「python 赤色 抽出」と検索すればたくさん出てくるので省略

○コード
検出する連番のパスを記述して実行するとフォルダ内に検出フレームを記述したテキストファイルを出力します。
テキスト内でファイル名の後に記述される配列には検出範囲のピクセル座標が記載されます。

import cv2
import numpy as np
import os
import glob

def main(path):
    items = glob.glob(path + "/*")
    for i in items:
        try:
            find_rect_of_target_color( i, path )
        except:
            print "Error"

def find_rect_of_target_color(img, path ):
    image = cv2.imread( img )
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL)
    h = hsv[:, :, 0]
    s = hsv[:, :, 1]
    mask = np.zeros(h.shape, dtype=np.uint8)
    mask[((h < 20) | (h > 200)) & (s > 128)] = 255
    contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    rects = []
    path += '/CheckList.txt'

    for contour in contours:
        approx = cv2.convexHull(contour)
        rect = cv2.boundingRect(approx)
        rects.append(np.array(rect))

    if(len(rects) != 0):
        print img.split("\\")[1], rects
        
        with open(path, mode='a') as f:
            f.write(img.split("\\")[1] + " " + str(rects) + "\n")

main("Z:/SEQUENCE/ShotA_C01")#検出する連番のパス
os.system('PAUSE')

この記事が気に入ったらサポートをしてみませんか?