识别opencv中的颜色序列

时间:2013-01-23 09:50:11

标签: opencv colors detection

我有一组图像,有四种可能的颜色R,G,B和Y.在相机前面,我有四个图像序列,可能有任何颜色组合。对于前者R,R,G,B或R,G,B,Y等。为了找到哪种算法或方法最佳的正确序列?

我添加了一个示例图片。enter image description here

代码应该返回正确的RGBG序列。

1 个答案:

答案 0 :(得分: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)

然后将图像二值化。您可以使用threshold()函数。但我不知道你的亮度如何。所以我用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']