113 votes

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

J'ai une image d'une boîte à café avec un couvercle orange dont je veux trouver la position. Voici l'image image .

L'utilitaire gcolor2 montre que le HSV au centre de la paupière 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 j'ai obtenu des résultats inattendus. 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()

6voto

Sami Dalati Points 141

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

Sur Gimp (ou autre logiciel de manipulation de photos), la gamme de teintes va de 0 à 360, puisque opencv met les informations de couleur dans un seul octet, la valeur numérique maximale dans un seul octet est 255, donc les valeurs de teintes d'openCV sont équivalentes aux valeurs de teintes de gimp divisées par 2.

J'ai découvert en essayant de faire de la détection d'objets basée sur l'espace couleur HSV qu'une plage de 5 (plage opencv) était suffisante pour filtrer une 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

6voto

Masum Billah Points 555

Pour trouver la valeur HSV du vert, 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]]]

1voto

Vous pouvez utiliser GIMP ou PaintDotNet pour obtenir la gamme exacte de HSV. Mais le problème est que la gamme HSV dans le logiciel graphique est différente de la même gamme dans OpenCV, donc vous avez besoin d'une fonction pour corriger cela pour vous. Dans ce but, vous pouvez utiliser la fonction suivante.

def fixHSVRange(h, s, v):
    # Normal H,S,V: (0-360,0-100%,0-100%)
    # OpenCV H,S,V: (0-180,0-255 ,0-255)
    return (180 * h / 360, 255 * s / 100, 255 * v / 100)

enter image description here

Par exemple, vous pouvez l'utiliser de la manière suivante :

im=cv2.imread("image.jpg",1)
im_hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
color1 = fixHSVRange(h=10, s=20, v=0)
color2 = fixHSVRange(h=30, s=70, v=100)
mask = cv2.inRange(im_hsv, color1, color2)
cv2.imwrite("mask.jpg",mask)

enter image description here

0voto

Student FourK Points 113

Si quelqu'un lit ce fil de discussion, et s'il/elle utilise Linux pour travailler avec OpenCV, il pourrait être intéressant pour ces personnes d'utiliser cette version corrigée de gcolor2 qui contient un hack plutôt sale, mais qui montre aussi les valeurs HSV au format OpenCV.

https://github.com/aozhigov/gcolor2_opencv

0voto

Shreyas Vedpathak Points 149

La plupart des méthodes mentionnées ci-dessus nécessitent généralement une certaine connaissance de la gamme de couleurs pour une couleur particulière, suivie d'essais et d'erreurs pour obtenir la bonne gamme. Mais la documentation officielle d'OpenCV suggère une meilleure méthode pour trouver les limites inférieures et supérieures du HSV, même pour les couleurs qui ne sont pas très courantes.

Comment trouver les valeurs HSV à suivre ?

Il s'agit d'une question courante que l'on trouve sur stackoverflow.com. C'est très simple et vous pouvez utiliser la même fonction, cv.cvtColor(). Au lieu de passer une image, vous passez simplement les valeurs BGR que vous voulez. Par exemple, pour trouver la valeur HSV du vert, essayez les commandes suivantes dans un terminal Python :

Vous pouvez trouver les valeurs exactes des pixels (BGR) de l'objet requis et les utiliser, par exemple le vert (0, 255, 0).

green = np.uint8([[[0,255,0 ]]])
hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
print(hsv_green)

[[[60 255 255]]]

Maintenant, vous prenez [H-10, 100,100] y [H+10, 255, 255] comme limite inférieure et limite supérieure respectivement. En dehors de cette méthode, vous pouvez utiliser n'importe quel outil de retouche d'image comme GIMP ou n'importe quel convertisseur en ligne pour trouver ces valeurs, mais n'oubliez pas d'ajuster les plages HSV.

Source :
Espaces colorimétriques et suivi d'objets OpenCV
GIMP - Outil de manipulation d'images

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X