Choisir les limites supérieures et inférieures appropriées pour la détection des couleurs avec ' TV:: inRange` (OpenCV)

j'ai une image d'une boîte à café avec un couvercle orange dont je veux trouver. Voici le image .

gcolor2 utilitaire indique le HSV au centre du couvercle (22, 59, 100). La question Est comment choisir les limites de la couleur alors? J'ai essayé min = (18, 40, 90) et max = (27, 255, 255), mais j'ai obtenu inattendu result

voici le code Python:

import cv

in_image = 'kaffee.png'
out_image = 'kaffee_out.png'
out_image_thr = 'kaffee_thr.png'

ORANGE_MIN = cv.Scalar(18, 40, 90)
ORANGE_MAX = cv.Scalar(27, 255, 255)
COLOR_MIN = ORANGE_MIN
COLOR_MAX = ORANGE_MAX

def test1():
    frame = cv.LoadImage(in_image)
    frameHSV = cv.CreateImage(cv.GetSize(frame), 8, 3)
    cv.CvtColor(frame, frameHSV, cv.CV_RGB2HSV)
    frame_threshed = cv.CreateImage(cv.GetSize(frameHSV), 8, 1)
    cv.InRangeS(frameHSV, COLOR_MIN, COLOR_MAX, frame_threshed)
    cv.SaveImage(out_image_thr, frame_threshed)

if __name__ == '__main__':
    test1()
55
demandé sur Silencer 2012-06-08 16:09:30

4 réponses

Problème 1: différentes applications utilisent différentes échelles pour HSV. Par exemple gimp utilise H = 0-360, S = 0-100 and V = 0-100 . Mais OpenCV utilise H: 0 - 180, S: 0 - 255, V: 0 - 255 . Ici, j'ai une teinte de 22 à gimp. J'ai donc pris la moitié, 11, et de la plage définie. c'est à dire (5,50,50) - (15,255,255) .

problème 2: et aussi, OpenCV utilise le format BGR, pas RGB. Alors changez votre code qui convertit RGB en HSV comme suit:

cv.CvtColor(frame, frameHSV, cv.CV_BGR2HSV)

Now l'exécuter. J'ai obtenu une sortie comme suit:

enter image description here

Espérons qu'est ce que tu voulais. Il y a quelques fausses détections, mais elles sont petites, donc vous pouvez choisir le plus grand contour qui est votre couvercle.

EDIT:

comme Karl Philip dit dans son commentaire, il serait bon d'ajouter un nouveau code. Mais il y a du changement d'une seule ligne. Donc, je voudrais comme pour ajouter le même code mis en œuvre dans le nouveau module cv2 , de sorte que les utilisateurs peuvent comparer la facilité et la flexibilité du nouveau module cv2 .

import cv2
import numpy as np

img = cv2.imread('sof.jpg')

ORANGE_MIN = np.array([5, 50, 50],np.uint8)
ORANGE_MAX = np.array([15, 255, 255],np.uint8)

hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

frame_threshed = cv2.inRange(hsv_img, ORANGE_MIN, ORANGE_MAX)
cv2.imwrite('output2.jpg', frame_threshed)

donne le même résultat que ci-dessus. Mais le code est beaucoup plus simple.

115
répondu Abid Rahman K 2012-06-08 15:13:10

j'ai créé ce programme simple pour obtenir des Codes HSV en temps réel

import cv2
import numpy as np


cap = cv2.VideoCapture(0)

def nothing(x):
    pass
# Creating a window for later use
cv2.namedWindow('result')

# Starting with 100's to prevent error while masking
h,s,v = 100,100,100

# Creating track bar
cv2.createTrackbar('h', 'result',0,179,nothing)
cv2.createTrackbar('s', 'result',0,255,nothing)
cv2.createTrackbar('v', 'result',0,255,nothing)

while(1):

    _, frame = cap.read()

    #converting to HSV
    hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)

    # get info from track bar and appy to result
    h = cv2.getTrackbarPos('h','result')
    s = cv2.getTrackbarPos('s','result')
    v = cv2.getTrackbarPos('v','result')

    # Normal masking algorithm
    lower_blue = np.array([h,s,v])
    upper_blue = np.array([180,255,255])

    mask = cv2.inRange(hsv,lower_blue, upper_blue)

    result = cv2.bitwise_and(frame,frame,mask = mask)

    cv2.imshow('result',result)

    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cap.release()

cv2.destroyAllWindows()
21
répondu Aruldd 2014-09-25 16:58:13

Ok, trouver la couleur dans HSV l'espace est une question ancienne mais commune. J'ai fait un hsv-colormap pour trouver rapidement une couleur spéciale. Le voici:

enter image description here

l'axe des abscisses représente Hue en [0,180), l'axe des y représente Saturation en [0,255], l'axe des y représente S = 255 , tandis que l'axe des Y représente V = 255 .

pour trouver une couleur, Généralement il suffit de chercher la gamme des H et S , et l'ensemble v dans la gamme(20, 255).

pour trouver la couleur orange, nous cherchons la carte, et trouver la meilleure gamme: H :[10, 25], S: [100, 255], and V: [20, 255] . Donc le masque est cv2.inRange(hsv,(10, 100, 20), (25, 255, 255) )

ensuite nous utilisons la plage trouvée pour chercher la couleur orange, c'est le résultat:

enter image description here


la méthode est simple mais commun à utiliser:

#!/usr/bin/python3
# 2018.01.21 20:46:41 CST
import cv2

img = cv2.imread("test.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv,(10, 100, 20), (25, 255, 255) )
cv2.imshow("orange", mask);cv2.waitKey();cv2.destroyAllWindows()

réponses similaires:

  1. comment définir une valeur de seuil pour détecter uniquement les objets de couleur verte dans une image: Opencv

  2. "choisir des valeurs HSV correctes pour le battage OpenCV avec des marquages

12
répondu Silencer 2018-01-21 13:18:50

OpenCV HSV gamme is: H: 0 à 179 S: 0 à 255 V: 0 à 255

sur Gimp (ou autre manipulation de photo sw) gamme de teintes de 0 à 360, depuis opencv mettre l'information de couleur dans un octet simple, la valeur du nombre maximum dans un octet simple est 255 donc les valeurs de teintes openCV sont équivalentes aux valeurs de teintes de gimp divisé par 2.

j'ai trouvé en essayant de faire la détection d'objet basée sur L'espace de couleur HSV qu'une gamme de 5 (Gamme opencv) était suffisante pour filtrer un couleur spécifique. Je vous conseille d'utiliser une palette de couleurs HSV pour déterminer la gamme qui fonctionne le mieux pour votre application.

HSV color palate with color detection in HSV space

3
répondu sami dalati 2017-03-01 00:27:55