Skip to content

Color detection

Integration

For detecting colors using OpenCV, we calibrate de color red, blue, green and yellow with HSV color code and then we detect the color of the cube using the a range of values for each color, using the following code:

import cv2
import numpy as np

def dibujar(mask,color):
    contornos,_ = cv2.findContours(mask, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    for c in contornos:
        area = cv2.contourArea(c)
        if area > 3000:
            M = cv2.moments(c)
            if (M["m00"]): M["m00"] = 1
            x = int(M["m10"]/M["m00"])
            y = int(M['m01']/M["m00"])
            nuevoContorno = cv2.convexHull(c)
            #print (nuevoContorno[0][1], nuevoContorno[1], nuevoContorno[2], nuevoContorno[3])

            x, y, w, h = cv2.boundingRect(c)
            xmin = x
            ymin = y
            xmax = x + w
            ymax = y + h
            print('xmin:', xmin, 'ymin:', ymin, 'xmax:', xmax, 'ymax:', ymax)
            print ("acabeeeeeeeeee")
            #cv2.circle(frame,(x,y),7,(0,255,0),-1)  
            #cv2.putText(frame,'{},{}'.format(x,y), (x+10,y), font, 0.75,(0,255,0),1,cv2.LINE_AA)

            if color == (255,0,0):
                print('azul')
            if color == (0,255,0):
                print('verde')
            if color == (0,0,255):
                print('rojo')   
            if color == (0,255,255):
                print('Amarillo')
            cv2.drawContours(frame,[nuevoContorno],0,color,3)


cap = cv2.VideoCapture(0)

redBajo1 = np.array([0,150,45],np.uint8)
redAlto1 = np.array([5,255,200],np.uint8)

redBajo2 = np.array([170,100,45],np.uint8)
redAlto2 = np.array([179,255,255],np.uint8)

azulBajo = np.array([110,130,45],np.uint8)
azulAlto = np.array([125,255,255],np.uint8)

verdeBajo = np.array([50,100,20],np.uint8)
verdeAlto = np.array([80,255,255],np.uint8)

amarillobajo = np.array([15,100,20],np.uint8)
amarilloalto = np.array([45,255,255],np.uint8) 

font = cv2.FONT_HERSHEY_SIMPLEX
while True:
    ret,frame = cap.read()
    if ret == True:
        frameHSV = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
        maskAzul = cv2.inRange(frameHSV,azulBajo,azulAlto)
        maskVerde = cv2.inRange(frameHSV,verdeBajo,verdeAlto)
        maskamarillo = cv2.inRange(frameHSV,amarillobajo, amarilloalto)
        maskRed1 = cv2.inRange(frameHSV,redBajo1, redAlto1)
        maskRed2 = cv2.inRange(frameHSV,redBajo2, redAlto2)
        maskred = cv2.add(maskRed1,maskRed2)
        dibujar(maskAzul,(255,0,0))
        dibujar(maskamarillo,(0,255,255))
        dibujar(maskVerde,(0,255,0))
        dibujar(maskred,(0,0,255))
        frame = cv2.resize(frame, (0, 0), fx = 0.3, fy = 0.3)
        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('s'):
            break
cap.release()
cv2.destroyAllWindows()

Color detector image