1.1 追踪蓝色物体
# 【利用掩膜(mask)进行“与”操作】
# 即掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔除
# 其余按位操作原理类似只是效果不同而已。
# mask = cv2.inRange(img_HSV,lower_blue,upper_blue)
# cv2.inRange()函数的原理:
# |-所有不在此范围的像素点都处理成0(黑色)
# |-所有在此范围的像素点都处理成255(白色)
# 第一个参数:hsv指的是原图(hsv类型的图)
# 第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0
# 第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0
# 而在lower_red~upper_red之间的值变成255
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('E:\\Image\\csdnImage\\find_blue.png',cv2.IMREAD_UNCHANGED)
# 转换到 HSV
img_HSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# 设定蓝色的阈值
lower_blue = np.array([110,100,100])
upper_blue = np.array([130,255,255])
# 根据阈值构建掩模
mask = cv2.inRange(img_HSV,lower_blue,upper_blue) #lower20===>0,upper200==>0,lower~upper==>255
print(lower_blue,upper_blue)
#对原图像和掩模进行位运算
res = cv2.bitwise_and(img,img,mask=mask)
cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
cv2.waitKey()
cv2.destroyAllWindows()
1.2 如何找到阈值
# 如何准确找到某个颜色的阈值呢?
# 现在你可以分别用 [H-100,100,100] 和 [H+100,255,255] 做上下阈值。
# 除了这个方法之外,你可以使用任何其他图像编辑软件(例如 GIMP)
# 或者在线转换软件找到相应的HSV值,但是最后别忘了调节HSV的范围。
import cv2
import numpy as np
import matplotlib.pyplot as plt
green=np.uint8([[[255,0,0]]])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)
#输出:[[[120 255 255]]]
[H-10,100,100] 和 [H+10,255,255]得到
[110 100 100] 和 [130 255 255]
1.3 追踪三种颜色物体并混合
def getHsv(data):
blue_hsv = cv2.cvtColor(data, cv2.COLOR_BGR2HSV)
print(data,blue_hsv)
return blue_hsv
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('opencv.png',cv2.IMREAD_UNCHANGED)
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#得到蓝色部分
blue = np.uint8([[[255,0,0]]])
first = getHsv(blue)[0][0][0]
print(first)
lowerb=np.array([first-10,100,100])
upperb=np.array([first+10,255,255])
mask = cv2.inRange(img_hsv,lowerb,upperb)
res1 = cv2.bitwise_and(img,img,mask=mask)
#得到绿色部分
green = np.uint8([[[0,255,0]]])
first = getHsv(green)[0][0][0]
print(first)
lowerb=np.array([first-10,100,100])
upperb=np.array([first+10,255,255])
mask = cv2.inRange(img_hsv,lowerb,upperb)
res2 = cv2.bitwise_and(img,img,mask=mask)
#得到红色部分
red = np.uint8([[[0,0,255]]])
first = getHsv(red)[0][0][0]
print(first)
lowerb=np.array([first-10,100,100])
upperb=np.array([first+10,255,255])
mask = cv2.inRange(img_hsv,lowerb,upperb)
res3 = cv2.bitwise_and(img,img,mask=mask)
cv2.imshow('res1',res1)
cv2.imshow('res2',res2)
cv2.imshow('res3',res3)
#将三种单独的颜色组合在一起
t = cv2.addWeighted(res1,0.5,res2,0.5,0)
result = cv2.addWeighted(t,0.5,res3,0.5,0)
cv2.imshow('result',result)
cv2.waitKey()
cv2.destroyAllWindows()
# blue:[[[120 255 255]]]
# green:[[[60 255 255]]]
# res:[[[0 255 255]]]
1.4 追踪动态视频中指定颜色物体
#读取视频,追踪红色物体
def captureVideo():
# capture = cv2.VideoCapture('cv.gif')
capture = cv2.VideoCapture('001.avi')
while True:
ret,frame = capture.read()
if ret is False:
break
hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
lowerb_hsv = np.array([156,43,46])
upperb_hsv = np.array([180,255,255])
mask = cv2.inRange(hsv,lowerb = lowerb_hsv,upperb = upperb_hsv)
res = cv2.bitwise_and(frame,frame,mask = mask)
cv2.imshow('frame',frame)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
c = cv2.waitKey(40)
if c==27:
break
captureVideo()
cv2.waitKey(0)
cv2.destroyAllWindows()