私は4つの可能な色R、G、B、Yの画像のセットを持っています。カメラの前に私は色の可能な組み合わせの4つの画像のシーケンスを持っています。例:R、R、G、BまたはR、G、B、Yなど。正しいシーケンスを見つけるために、どのアルゴリズムまたはアプローチが最適ですか?
サンプル画像を追加しました。
コードはRGBGとして正しいシーケンスを返す必要があります。
前述したように、画像を HSV 平面に変換します。HSV プレーンは、特定の色を選択する方が適しています。(コードは Python です)
import numpy as np
import cv2
img = cv2.imread('sofqn.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(gray,cv2.COLOR_BGR2HSV)
次に、画像を 2 値化します。しきい値()関数を使用できます。しかし、あなたの明るさがどのようになるかはわかりません。だから私はCanny()でエッジ検出をします。そしてその中に輪郭を見つけます。
edges = cv2.Canny(img,50,150)
contours,hierarchy = cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
次に、各輪郭(今のところ、輪郭を画像内のオブジェクトと見なすことができます)について、その領域を見つけます。小さい場合はノイズですので避けてください。それ以外の場合は、左上隅 (x,y)、幅 (w)、高さ (h) を与える境界四角形を見つけます。そこから、正方形の中心点を見つけます。HSV 画像で色を確認し、R、G、B、Y であるかどうかを確認します。それら、つまり重心 (cx,cy) と色をリスト (または配列) に入れます。最後に、最初の行が最初の正方形に対応するように、x 座標に従って並べ替えます。
res = []
for cnt in contours:
if cv2.contourArea(cnt) > 100:
x,y,w,h = cv2.boundingRect(cnt)
cx,cy = x+w/2, y+h/2
color = hsv[cy,cx,0]
if (color < 10 or color > 170):
res.append([cx,cy,'R'])
elif(50 < color < 70):
res.append([cx,cy,'G'])
elif(20 < color <40):
res.append([cx,cy,'Y'])
elif(110 < color < 130):
res.append([cx,cy,'B'])
res = sorted(res,key = lambda res : res[0])
colors = [x[2] for x in res]
print colors
これは私に結果を与えます:['R', 'G', 'B', 'G']