J'ai l'image d'une canette de café avec un couvercle orange que je veux trouver .. Voici la .
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
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()
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:
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.
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()
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:
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:
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:
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.
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]]]