🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1888閲覧

pythoを使った 画像認識プログラム

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/28 15:15

編集2020/01/09 10:03

img = cv2.imread('video/frame_109.png')

BGR -> グレースケール

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

エッジ抽出 (Canny)

edges = cv2.Canny(gray, 18, 45, apertureSize=3)
cv2.imwrite('images/aaa/edges.png', edges)

膨張処理

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (4, 4))
edges = cv2.dilate(edges, kernel)
cv2.imwrite('images/aaa/edges2.png', edges)

輪郭抽出

contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.imwrite('images/aaa/hierarchy.png', hierarchy)

面積でフィルタリング

rects = []
for cnt, hrchy in zip(contours, hierarchy[0]):
if cv2.contourArea(cnt) < 3000:
continue # 面積が小さいものは除く
if cv2.contourArea(cnt) > 15000:
continue
if hrchy[3] == -1:
continue # ルートノードは除く
# 輪郭を囲む長方形を計算する。
rect = cv2.minAreaRect(cnt)
rect_points = cv2.boxPoints(rect).astype(int)
rects.append(rect_points)

x-y 順でソート

rects = sorted(rects, key=lambda x: (x[0][1], x[0][0]))

描画する。

for i, rect in enumerate(rects):
color = np.random.randint(0, 255, 3).tolist()
cv2.drawContours(img, rects, i, color, 2)
cv2.putText(img, str(i), tuple(rect[0]), cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 3)

print('rect:\n', rect)

cv2.imwrite('images/aaa/frame_109.png', img)
コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まず撮影環境を整えたほうがいいのではないでしょうか。
2値化が綺麗にいかない原因は、手で持って撮影しているため、光の当たり方にムラがあることです。画像内に明るい部分と暗い部分があったり、影ができていると、2値化はうまくいきません。
照明が十分な部屋で机の上にノートをおいて、真上からカメラで撮影したほうがよいと思います。

しかし、ブロックの輪郭が繋がっていないため

2値化した結果が少しだけ途切れている場合などは、膨張処理を行うことでつなげることができるかもしれません。

モルフォロジー変換 — OpenCV-Python Tutorials 1 documentation

投稿2019/11/29 06:55

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/30 14:16

アドバイス有難うございます。 撮影環境を整えた方がよいという意見はごもっともですが、すでに撮影された映像をもとにプログラムを構築しなければならない状況です。 膨張処理を行いましたが、ブロック内の文字とブロックの枠組みがくっつき、正方形面積が2分割されてしまいます。
tiitoi

2019/12/02 03:19

質問欄に四角が描画されていない元画像を貼ることはできますか? ちなみに質問の画像を見ると、四角の認識はできているようなので、あとは丸印が検出できればいいということでしょうか?
guest

0

・ブロックの認識ですが、OpenCVで切れてしまっている輪郭を抽出したいで挙げられているadaptiveThreshold()のcv2.ADAPTIVE_THRESH_GAUSSIAN_Cで処理を行うと、下の画像のようにいい感じにブロックをハッキリと表すことができました。
しかし、ブロックの輪郭が繋がっていないため、輪郭抽出することができません。また、ハフ変換により直線検出により、輪郭抽出を行い、面積の大きさによりブロック以外の面積をフィルタしようとしましたが、直線を検知しすぎて上手くいきませんでした。もしかしたら、値の設定など上手くできていなかったのかもしれませんが。。。
何か各ブロックを認識できるいい方法はございませんか。

・インデントについて学び、for文の範囲を考え、下記のプログラムに変更することで一括処理をすることができました。

python

1for i in range(1,288): 2 img = cv2.imread('images/video/frame_{0:03}.png'.format(i))

python

1for i in range(1,288): 2 3 cv2.imwrite('images/aaa/frame_{0:03}.png'.format(i), img)

投稿2019/11/28 15:47

編集2020/01/09 10:04
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問