0
import numpy as np 
import cv2 
import os 

dir = 'C:\\Project\\Interview Packet' 
os.chdir(dir) 

image = cv2.imread('us_flag_color.png') 
template = cv2.imread('mask.png') 

imageGray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
templateGray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY) 

template = cv2.Canny(template, 50, 200) 

result = cv2.matchTemplate(imageGray, templateGray, cv2.TM_SQDIFF) 
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) 

w, h = template.shape[:2] 
threshold = 0.8*max_val 
loc = np.where(result >= threshold) 
for pt in zip(*loc[::-1]): 
    cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2) 

cv2.imwrite("res.png", image) 

私は星が付いた米国の旗と黒の星からなるマスクのイメージを持っています。マスク画像を使用して、私は異なった色をしていますが、米国の旗のすべての星を検出したいと思います。上記のコードを使用すると、下の図に示すように、白と書かれた星を認識することしかできませんでした。質問画像のテンプレートと一致する画像内の異なる色のオブジェクトを認識する方法は?

enter image description here

ボックス着色赤、そのマスク画像内の1つのその着色ブラックマッチング下星を有しています。私はこれらの星を識別するために灰色のイメージを使用しているため、これは推測しています。以下に示すように、色付きの星はグレー表示の過程で退色し、アルゴリズムは背景色と区別できません。

enter image description here

、元画像は下に掲載されています

  • マスク:enter image description here
  • たちフラグ:enter image description here
+0

オリジナルの入力画像も投稿できますか? ( 'us_flag_color.png'と' mask.png') –

+0

オブジェクトを区別する色であるため、RGB画像のグレースケールバージョンではなく、HSVまたはHSI色空間で作業することを検討します。 –

+0

@DanMašekが追加されました。 – user007

答えて

0

は通常、私はHSV色空間における色情報と画像を処理。私はRGBHSVの異なるチャネルを分析し、Vチャネルがこの質問に最適であることを見つける。

BGR

enter image description here

HSV

enter image description here

が続いてテンプレートマッチングを行う、私はこれを取得:

enter image description here


おそらくfindContoursを使用して作業すると思います。

+0

あなたは私に境界ボックスの厚さを制御する方法を教えてください。私は次のコードを試して、私は星と重なる非常に厚いバウンディングボックスを取得します。あなたの出力にボックスの厚さを再現する方法を教えてください。 for zip(* loc [:: - 1]): cv2.rectangle(image、pt、(pt [0] + w、pt [1] + h)、(0,0,255)、1、 8) – user007

+0

スレッショルドの 'cv2.minMaxLoc'の結果で見つかった' loc'をチェックすると、すべての領域に複数のptsがあることがわかります。そして、私はこの比率を「0.9」に調整するので、ptsは小さくなり、ボックスは薄くなります(しかし、各スターのために1つ以上のボックスまで)ので、すべてのスターのボックスの考え方を実際に制御することはできません。私が言ったように、 'findContours'は毎星ごとに1つの輪郭しか見つけられないので、より良く動作します。 – Silencer

関連する問題