这几天在学习opencv_python时遇到不知如何确定图片要跟踪物体HSV范围的情况,几经查找和总结,终于找到了相对精确的办法。
思路如下:先确定图片中物体的HSV值,然后创建HSV进度条(H、S、V最大最小值共6条进度条),通过调节进度条,确定HSV范围。
一、用如下方法确定想要颜色的HSV值,比如蓝色。
import cv2
import numpy as np
blue = np.uint8([[[255,0,0]]])
hsv_blue = cv.cvtColor(blue, cv.COLOR_BGR2HSV)
print(hsv_blue)
#输出结果为: [[[ 120 255 255]]]
二、创建一个HSV上下阈值的六个进度条(h_min,h_max,s_min,s_max,v_min,v_max)并输出原图、掩模图、效果图。
import cv2
import numpy as np
import time
def nothing(x):
pass
cv2.namedWindow('image',cv2.WINDOW_AUTOSIZE)
blue = np.uint8([[[255,0,0]]])
hsv_blue = cv2.cvtColor(blue,cv2.COLOR_BGR2HSV)
print(hsv_blue)
cv2.createTrackbar('Hue min','image',10,179,nothing)
cv2.createTrackbar('Hue max','image',10,179,nothing)
cv2.createTrackbar('sat min','image',10,255,nothing)
cv2.createTrackbar('sat max','image',10,255,nothing)
cv2.createTrackbar('val min','image',10,255,nothing)
cv2.createTrackbar('val max','image',10,255,nothing)
img = cv2.imread(r'D:\python\python\installation package\1.JPG')
while(1):
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h_min = cv2.getTrackbarPos('Hue min','image')
h_max = cv2.getTrackbarPos('Hue max','image')
s_min = cv2.getTrackbarPos('sat min','image')
s_max = cv2.getTrackbarPos('sat max','image')
v_min = cv2.getTrackbarPos('val min','image')
v_max = cv2.getTrackbarPos('val max','image')
lower = np.array([h_min,s_min,v_min])
upper = np.array([h_max,s_max,v_max])
mask = cv2.inRange(hsv,lower,upper)
res = cv2.bitwise_and(img,img,mask=mask)
cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
k = cv2.waitKey(5)
if k == 27:
break
cv2.destroyAllWindows()
从图1可知蓝色HSV值为[120,255,255],那么H值可预先定为H-10和H+10,对于S、V两值的上限可定为255,255(即初定蓝色HSV值下限为[110,待调整值,待调整值],上限为[130,255,255]),至于下限待调整值,则可通过调节进度条,让想要的物体图形尽可能显示出来,那么当想要的物体尽可能显示出来时,那么就可以确定物体HSV值的范围。
初步得到上述大概图,接下来我们再调整sat_min,和val_min,如果结果图还不能要求,则要继续调节h_min和h_max的值。结果图如下:
结果显示,对于该图蓝色物体的HSV值的取值范围为lower=[91,13,38],upper=[122,255,255]。
下图是各种颜色HSV值的参考值图
以上内容是本人学习总结,如有错误烦请指出,部分内容参考于网络,如有侵权烦请通知本人删除,谢谢。