1

私は4つの可能な色R、G、B、Yの画像のセットを持っています。カメラの前に私は色の可能な組み合わせの4つの画像のシーケンスを持っています。例:R、R、G、BまたはR、G、B、Yなど。正しいシーケンスを見つけるために、どのアルゴリズムまたはアプローチが最適ですか?

サンプル画像を追加しました。ここに画像の説明を入力してください

コードはRGBGとして正しいシーケンスを返す必要があります。

4

1 に答える 1

3

前述したように、画像を 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']

于 2013-01-23T10:41:02.777 に答える