Choisir les limites HSV optimales pour la détection des couleurs avec cv::inRange dans OpenCV
Dans les tâches de traitement d'image, il est souvent nécessaire de détecter des objets en fonction sur leur couleur. À cette fin, la fonction cv::inRange est couramment utilisée dans OpenCV pour identifier les pixels dans une plage de couleurs HSV spécifiée. Cependant, la sélection des limites HSV appropriées peut être difficile, en particulier lorsque différentes applications utilisent différentes échelles HSV et formats de couleur.
Problème :
Considérez le scénario de détection de l'orange. couvercle sur une image de canette de café. À l'aide d'un outil Gimp, la valeur HSV au centre du couvercle s'est avérée être (22, 59, 100). Cependant, l'application de la plage HSV (18, 40, 90) - (27, 255, 255) a abouti à des résultats de détection insatisfaisants.
Solution 1 : Ajuster l'échelle HSV
Pour résoudre ce problème, il est crucial d'être conscient que différentes applications utilisent différentes échelles HSV. Dans ce cas, gimp utilise l'échelle H : 0-360, S : 0-100, V : 0-100, tandis qu'OpenCV utilise H : 0-179, S : 0-255, V : 0-255. Pour la valeur de teinte (22) obtenue à partir de Gimp, il faut en prendre la moitié (11) et ajuster la plage en conséquence. Cela se traduit par une nouvelle plage HSV de (5, 50, 50) - (15, 255, 255).
Solution 2 : Convertir au format BGR
En outre , il est important de considérer qu'OpenCV utilise le format de couleur BGR, et non RVB. Par conséquent, dans le code Python, la conversion cv::CV_RGB2HSV doit être remplacée par cv::CV_BGR2HSV.
En implémentant ces modifications, l'algorithme de détection devrait donner des résultats améliorés. Bien que des fausses détections mineures puissent encore se produire, le contour le plus grand doit correspondre au couvercle.
Code Python amélioré avec OpenCV 2 :
import cv2 in_image = 'kaffee.png' out_image = 'kaffee_out.png' out_image_thr = 'kaffee_thr.png' ORANGE_MIN = np.array([5, 50, 50], np.uint8) ORANGE_MAX = np.array([15, 255, 255], np.uint8) def test1(): frame = cv2.imread(in_image) frameHSV = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) frame_threshed = cv2.inRange(frameHSV, ORANGE_MIN, ORANGE_MAX) cv2.imwrite(out_image_thr, frame_threshed) if __name__ == '__main__': test1()
Python amélioré Coder avec OpenCV 4 :
import cv2 import numpy as np in_image = 'kaffee.png' out_image = 'kaffee_out.png' out_image_thr = 'kaffee_thr.png' ORANGE_MIN = np.array([5, 50, 50], np.uint8) ORANGE_MAX = np.array([15, 255, 255], np.uint8) def test1(): frame = cv2.imread(in_image) frameHSV = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) frame_threshed = cv2.inRange(frameHSV, ORANGE_MIN, ORANGE_MAX) cv2.imwrite(out_image_thr, frame_threshed) if __name__ == '__main__': test1()
En utilisant ces codes mis à jour, il est possible de coder avec précision détectez le couvercle orange sur l'image de la boîte de café.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!