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

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

詳細はこちら
Python

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

Q&A

解決済

1回答

622閲覧

python 特徴量マッチング

reonald

総合スコア32

Python

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

0グッド

0クリップ

投稿2019/12/26 08:34

画像分類をしており,特徴量マッチングを行いたいと思っております。
現状matchファイルのaというファイルに3枚の画像データが入っており,それら3枚の画像データ(教師データ)と分類したい画像(target_img)の特徴量の対応値(ret)までは取得できております。

import cv2 import os import glob IMG_SIZE = (200, 200) target_img = cv2.imread('./match/./pura/a (77).jpg', cv2.IMREAD_GRAYSCALE) target_img = cv2.resize(target_img, IMG_SIZE) bf = cv2.BFMatcher(cv2.NORM_HAMMING) detector = cv2.ORB_create() (target_kp, target_des) = detector.detectAndCompute(target_img, None) files = glob.glob("./match/./a/*") for i, f in enumerate(files): try: img = cv2.imread(f) img = cv2.resize(img, IMG_SIZE) gray = cv2.cvtColor(img, cv2.IMREAD_GRAYSCALE) gray = cv2.resize(gray, IMG_SIZE) (comparing_kp, comparing_des) = detector.detectAndCompute(gray, None) matches = bf.match(target_des, comparing_des) dist = [m.distance for m in matches] ret = sum(dist) / len(dist) except cv2.error: ret = 100000 print(i, ret) コード

現状このコードで下記のような結果が出力されます。
0 71.97631578947369
1 70.15263157894736
2 78.3921052631579
3 68.20526315789473

ここからこれらの画像(target_img)をretの値が最小のグループに分類して,
ファイルにそれぞれ保存したいのですが,どのようなコードかが分かりません。

今の画像であれば,0,1,2,3のファイルを作って,その中の3に分類したいです。
どなたかよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

例えばこんな感じですか?

python

1# 分類番号と特徴量の組を用意して、特徴量でソートする 2rets = [[0,71.97631578947369],[1,70.15263157894736],[2,78.3921052631579],[3,68.20526315789473]] 3srets = sorted(rets, key=lambda x: x[1]) 4for d in srets: 5 print(d) 6# 特徴量とtargetを比較する 7target = 68.20526315789472 8isDetect=False 9for d in srets: 10 # targetが特徴量未満ならその分類とする 11 if target < d[1]: 12 print('target value={0} is class {1}'.format(target, d[0])) 13 isDetect=True 14 break 15# targetがすべての特徴量を超える場合は特徴量が最大の分類番号とする 16if isDetect is False: 17 c = srets[len(srets)-1][0] 18 print('target value={0} is class {1}'.format(target, c))

[3, 68.20526315789473]
[1, 70.15263157894736]
[0, 71.97631578947369]
[2, 78.3921052631579]
target value=67.9 is class 3

投稿2019/12/26 18:50

TaroToyotomi

総合スコア1448

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

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

reonald

2019/12/27 04:34

globを使って,複数の画像を一度に回したいので,具体的な数値はコードに入れたくないのですが,,,
TaroToyotomi

2019/12/27 15:15

いや、比較の具体的な方法を聞きたいのかと思ってましたが・・・。 実際の数値はあなたのコードで計算された結果を配列に入れればいいだけなのでは。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問