web-dev-qa-db-fra.com

Choisir les limites supérieures et inférieures correctes du HSV pour la détection de couleur avec`cv :: inRange` (OpenCV)

J'ai l'image d'une canette de café avec un couvercle orange que je veux trouver .. Voici la image.

l’utilitaire gcolor2 indique que le HSV au centre du couvercle est (22, 59, 100) . La question est de savoir comment choisir les limites de la couleur alors? J'ai essayé min = (18, 40, 90) et max = (27, 255, 255), mais 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 __== '__main__':
    test1()
57
Student FourK

Problème 1: Différentes applications utilisent différentes échelles pour le 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 obtenu une valeur de teinte de 22 dans gimp. J'ai donc pris la moitié, 11, et défini la plage pour cela. c'est-à-dire (5,50,50) - (15,255,255).

Problème 2: De plus, OpenCV utilise le format BGR, pas le format RVB. Changez donc votre code qui convertit RVB en HSV comme suit:

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

Maintenant, lancez-le. J'ai une sortie comme suit:

enter image description here

J'espère que c'est ce que tu voulais. Il y a quelques fausses détections, mais elles sont petites, vous pouvez donc choisir le plus grand contour qui est votre couvercle.

MODIFIER:

Comme le dit Philip Philip dans son commentaire, il serait bon d’ajouter du nouveau code. Mais il n'y a changement que d'une seule ligne. Donc, j'aimerais ajouter le même code que celui implémenté dans le nouveau module cv2, afin que les utilisateurs puissent 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)

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

124
Abid Rahman K

J'ai créé ce programme simple pour obtenir les 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()
22
Aruldd

Ok, trouver une couleur dans HSV espace est une question ancienne mais courante. J'ai créé un hsv-colormap pour rechercher rapidement une couleur spéciale. C'est ici:

 enter image description here

L'axe des abscisses représente Hue dans [0,180), l'axe des ordonnées1 représente Saturation dans [0,255], l'axe des y2 représente S = 255, tandis que garder V = 255.

Pour trouver une couleur, il suffit généralement de rechercher la plage H et S et de définir v dans la plage (20, 255).

Pour trouver la couleur orange, nous recherchons la carte et trouvons la meilleure plage: 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 rechercher la couleur orange, voici le résultat:

 enter image description here


La méthode est simple mais commune à 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. Choix des valeurs HSV correctes pour le seuillage OpenCV avec InRangeS

15
Kinght 金

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

Sur Gimp (ou autre manipulation photographique sw), les teintes vont de 0 à 360, étant donné qu'opencv place les informations de couleur dans un seul octet, la valeur numérique maximale dans un seul octet est de 255; .

Lors de la détection d'objet basée sur l'espace colorimétrique HSV, j'ai constaté qu'une plage de 5 (plage ouverte) était suffisante pour filtrer une couleur spécifique. Je vous conseillerais d'utiliser une palette de couleurs HSV pour déterminer la plage qui convient le mieux à votre application.

 HSV color palate with color detection in HSV space

3
sami dalati

Pour trouver la valeur HSV de Green, essayez les commandes suivantes dans le terminal Python

green = np.uint8([[[0,255,0 ]]])
hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print hsv_green
[[[ 60 255 255]]]
0
Masum Billah