【问题标题】:Identifying color sequence in opencv在opencv中识别颜色序列
【发布时间】:2013-01-23 09:50:11
【问题描述】:

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

我添加了一个示例图片。

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

【问题讨论】:

  • 您可以将图像转换为hsv平面并检查颜色。如果您可以添加示例图像,那就太好了。
  • 我添加了一张图片。请帮帮我。
  • 图像大小和正方形大小是否始终不变?
  • 几乎不变。可能有5-10像素的差异
  • 背景总是白色的?正方形的颜色也总是一样的吗?或照明条件的任何变化?

标签: opencv colors detection


【解决方案1】:

正如我之前提到的,将图像转换为 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']

【讨论】:

  • 感谢您的帮助。我现在正在尝试这个。很棒的解释
  • 在必须在电缆线中找到适当颜色序列的应用中,此代码是否可用于颜色序列识别?示例图片:ibb.co/c40aO5 这里我们要检查电线的顺序是否正确,所以只有颜色的顺序:红色、黑色、黄色、棕色、粉红色、黄色、蓝色、绿色、白色、黑色、红色可以,其他组合不行!任何人都可以建议如何解决这个问题?
猜你喜欢
  • 2011-12-18
  • 2018-03-07
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多