質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

Q&A

1回答

12161閲覧

テンプレートマッチングの精度を向上させたいです。

stylenanda

総合スコア10

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

0グッド

0クリップ

投稿2019/11/26 06:36

編集2019/11/26 06:37

python

1import cv2 2import matplotlib.pyplot as plt 3import numpy as np 4 5 6# 入力画像、テンプレート画像を読み込む。 7img = cv2.imread('mosaic2.jpg',0) #変形後 8image = cv2.imread('mosaic1.jpg',0) 9template = image[29:114,207:292] # テンプレート画像 10 11 12# テンプレートマッチングを行う。 13result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED) 14 15H, W = img.shape 16h, w = template.shape 17 18print('img.shape', img.shape) 19print('template.shape', template.shape) 20 21print(H - h + 1, W - w + 1) 22print('result.shape', result.shape) 23 24x, y = 207,29 25position1 = np.array([207, 29]) 26 27# 検索窓の範囲を描画する。 28fig, ax = plt.subplots(facecolor="w") 29ax.add_patch(plt.Rectangle((x, y), w, h, ec="r", fc="none")) 30ax.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) 31 32plt.show() 33 34# 最も類似度が高い位置を取得する。 35minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result) 36print(f"max value: {maxVal}, position: {maxLoc}") 37 38# 描画する。 39fig, ax = plt.subplots(facecolor="w") 40ax.add_patch(plt.Rectangle(maxLoc, w, h, ec="r", lw=1, fc="none")) 41ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) 42 43plt.show() 44

↓mosaic1の画像です。

画像として貼り付けできないのでこちらにリンクとして貼ります。
リンク内容

mosaic2はこの画像を-5°回転したものになります。
イメージ説明

最初の画像から抽出した部分だけをテンプレートマッチングしたいのですが、
今のプログラムではマッチング結果が-5°回転しただけで精度が低くなってしまいます。

最も類似度が高い位置を取得し、それを描画した時に赤い正方形が-5°回転している形になりたいのですがどのようにプログラムを書き換えればよいかどなたか教えてください。

また、実行結果で一枚目の画像と二枚目の画像が同時に出力されるにはどうすればよいでしょうか

参考しているサイトはこちらになります。
リンク内容

長文乱文で申し訳ありませんが行き詰まっているのでどなたか教えてください。

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

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

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

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

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

guest

回答1

0

要は,テンプレート画像と探索対象画像上の像との間に回転があるときに,回転角も結果として得たいということでしょうか.

誰でも考え付く方法としては「テンプレートを回転させてはテンプレートマッチングしてみることを,様々な回転角度で試す」という力業があります.
例えば
{元々のテンプレート画像, 元々のテンプレート画像を1度回転したもの, 2度回転したもの, ... ,359度回転したもの}という360個のテンプレートを用意して360回のテンプレートマッチング処理をしてみて,その中で最も類似度が良い結果を採用する,的な.

で,そういう力業はやりたくないという場合は……
画像をダイレクトに比較するのではなくて,画像から何かしらの回転不変な特徴量を求めて,特徴量で比較するような処理を考えることになります.
(単純にcv2.matchTemplateを使うのではなく,何らかのマッチング処理を自前で実装することになるでしょう)
「画像 回転不変 特徴」みたいなワードで検索するなりしてみてはどうでしょうか.


追記:
テンプレートの絵次第では,
方向毎のヒストグラムだとか,慣性主軸だとかを見ることで「方向(回転量)」をある程度簡単に考えることができる(定義できる,というか)場合もある.
その場合,走査窓範囲毎に「テンプレートを何度回転させたものとの相関値を計算すれば良さそうか」を求めてやることができるので,前記の360パターンとの比較を力技でやるような話と比べると計算量が軽くなる.

投稿2019/11/26 09:51

編集2019/11/27 01:35
fana

総合スコア11654

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

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

fana

2019/11/26 09:59

そういえば,OpenCVに位相限定相関法の実装がある的な話を過去にどこかで見た記憶があるけども,どうなんだろう? もちろん試したこともないし,機能として回転まで見てくれるものなのか否か等,全てが未知.
退会済みユーザー

退会済みユーザー

2019/11/26 21:38

横やりですが、面白いキーワードをありがとうございます。 ■位相限定相関法(POC)の記事 http://opencv.blog.jp/python/%E4%BD%8D%E7%9B%B8%E9%99%90%E5%AE%9A%E7%9B%B8%E9%96%A2%E6%B3%95 ■関数の解説 https://docs.opencv.org/2.4/modules/imgproc/doc/motion_analysis_and_object_tracking.html#phasecorrelate 要旨:シフト(上下左右)を検出しますので、簡易動き(ブレ)検知に使えます、だそうです。 --- 回転検知には、極座標を使う回転不変位相限定相関法(RIPOC)を使うそうです。 ■RIPOC記事 https://www.daisukekobayashi.com/blog/rotation-invariant-phase-only-correlation-in-python/ ■コード(Apache2.0、太っ腹!) https://github.com/daisukekobayashi/phase-only-correlation
stylenanda

2019/11/27 04:37

様々なご意見、ありがとうございます。 特徴量検出のプログラムは作成したことがあるのですが、特徴量をマッチングすることはできるのですが、それを数値的に出す方法がよく分かりません。 特徴量はORBやAMAZEをなどを利用して検出するということは分かりますが、最終的には画像の相感度を求めたいので数値的にだす方法を教えてください。
fana

2019/11/27 05:07

Aという画像から計算した特徴量と,Bという画像から計算した特徴量とが「似ている」とき,「画像Aと画像Bは似ている」と推測できる…と言う話ですから,用いる特徴量の意味的に妥当な「似具合」を計算すれば良いです. 私はORBとかAKAZE(かな?)とかの中身の詳細まで踏み込んだことが無いので,それらを用いる場合の具体的な演算内容までは助言できかねます. (多次元の特徴をどう比較するのか? 差? 内積とか? その他?) そういった既存の特徴量を用いるなら,そららの特徴量を用いたマッチング処理の内容(マッチングできるということは似具合を計算しているはず)について調べてみてはいかがでしょうか.
fana

2019/11/27 05:19

例えばてきとーにOpenCVでORB使う例をググると https://code-graffiti.com/opencv-feature-matching-in-python/ のコードでは比較計算方法として何やら cv2.NORM_HAMMING なるもの指定しています. → cv2.NORM_HAMMING についてさらに調べれば,どうやらここのコードでは ORBの比較にハミング距離を使っているっぽい → じゃあ「ハミング距離」ってなんだよ,…みたくさらに調べていくとか.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問