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 .
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
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()
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:
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.
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()
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:
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:
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:
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.