質問は
1、資料の最外輪郭内のみでマス目の輪郭抽出を行う
2、番号を振った各マス目内に「点」があれば、そのマス目のカウントを+1する
方法です。
座標を扱ったプログラムの構築の見当がつかず途方に暮れています。
拙い文章で申し訳ございませんが、よろしくお願いたします。
python
1import cv2 2import numpy as np! 3 4img = cv2.imread('video/frame_109.png') 5 6# BGR -> グレースケール 7gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 8# エッジ抽出 (Canny) 9edges = cv2.Canny(gray, 18, 45, apertureSize=3) 10cv2.imwrite('images/aaa/edges.png', edges) 11# 膨張処理 12kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (4, 4)) 13edges = cv2.dilate(edges, kernel) 14cv2.imwrite('images/aaa/edges2.png', edges) 15 16 17# 輪郭抽出 18contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 19cv2.imwrite('images/aaa/hierarchy.png', hierarchy) 20# 面積でフィルタリング 21rects = [] 22for cnt, hrchy in zip(contours, hierarchy[0]): 23 if cv2.contourArea(cnt) < 3000: 24 continue # 面積が小さいものは除く 25 if cv2.contourArea(cnt) > 15000: 26 continue 27 if hrchy[3] == -1: 28 continue # ルートノードは除く 29 # 輪郭を囲む長方形を計算する。 30 rect = cv2.minAreaRect(cnt) 31 rect_points = cv2.boxPoints(rect).astype(int) 32 rects.append(rect_points) 33 34# x-y 順でソート 35rects = sorted(rects, key=lambda x: (x[0][1], x[0][0])) 36 37# 描画する。 38for i, rect in enumerate(rects): 39 color = np.random.randint(0, 255, 3).tolist() 40 cv2.drawContours(img, rects, i, color, 2) 41 cv2.putText(img, str(i), tuple(rect[0]), cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 3) 42 43 print('rect:\n', rect) 44 45cv2.imwrite('images/aaa/frame_109.png', img)
想定する(サポートする)撮影状況について書いた方が良いように思います.
例えば,提示されている画像で言えば,
* 3x5のマス全体が映っていない
* 撮影対象をどこかに設置するのではなくて手で持っている
* マスは若干傾いている
* 撮影対象は平面でなくふにゃふにゃしている
…等,その具合がどの程度まで厳しくなるのか?次第で処理も厳しくなりそうな要素が見られます.
あと,「点」の意味がわからない.
アドバイスありがとうございます。
質問文の不足申し訳ございませんでした。
「点」は資料を読む人の視線の位置で、青い点で動画上に表示されます。
撮影状況は、資料を読む人の頭に小型カメラを装着してもらい撮影しています。(動画はすでに撮影しています)
被験者には基本的にボードに挟んだ資料を真っ直ぐ見てもらうように伝えていますが、手で持ちながらのため、
資料をめくる際に資料がふにゃふにゃになったり、
資料が傾いたり、
資料の端が動画の外にでたり、
また、照明の関係で資料に影ができたり
しています。
プログラムで完璧に処理できなくてもいいので、できるだけ高い精度でマス目に入った「点」を自動でカウントできるようにしたいと考えています。
そのため、追加でプログラムで処理できなかった画像フレームを表示するようにし、その画像フレームはプログラムの処理後に自分で確認しようと考えています。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー