openCV中的颜色转换有100多种,但我们经常用到的只有两种。BGR↔Gray 和 BGR↔HSV。
用到的函数cv2.cvtColor(input_image,flag)。flag就是要转化的类型。
接下来重点介绍物体的跟踪。在此之前需要知道几点。
掩膜
含义:掩模是由0和1组成的一个二进制图像。当在某一功能中应用掩模时,1值区域被处理,被屏蔽的0值区域不被包括在计算中。通过指定的数据值、数据范围、有限或无限值、感兴趣区和注释文件来定义图像掩模,也可以应用上述选项的任意组合作为输入来建立掩模。
示例:下图中的mask就是掩膜。
HSV
H(Hue):色调,取值范围是 [0,179] ,它用来限制某一个颜色的彩色光谱范围;
S(Saturation):饱和度,取值范围是 [0,255] ,它用来限制颜色的深度,值越大颜色越深;
V(Value):色值,取值范围是 [0,255] ,它用来限制像素的亮度,值越大像素越亮。
cv2.bitwise_and()
对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0。示例参照上图。
uint8
uint8是专门用于存储各种图像的(包括RGB,灰度图像等),范围是从0–255.
想转化为uint8类型的,可以点下边的网址:https://blog.csdn.net/qq_39751320/article/details/104849194
追踪蓝色物体源码
import cv2
import numpy as np
cap=cv2.VideoCapture(0)
while (1):
#获取每一帧的图片
ret,frame=cap.read()
#转化为HSV
hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
#设定蓝色的阈值
lower_blue=np.array([110,50,50])
upper_blue=np.array([130,255,255])
#根据阈值构建掩膜
mask=cv2.inRange(hsv,lower_blue,upper_blue)
#对原图像和掩膜进行位运算
#src1:第一个图像(合并的第一个对象)src2:第二个图像(合并的第二个对象)mask:理解为要合并的规则。
res=cv2.bitwise_and(frame,frame,mask=mask)
#显示图像
cv2.imshow('frame',frame)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
k=cv2.waitKey(5)&0xFF
#按esc键退出
if k==27:
break
cv2.destroyAllWindows()
获取阈值
追踪物体的关键就是获取相关的阈值。接下来给出将RGB转化为HSV的方法。
import cv2
import numpy as np
# 这里的三层括号应该分别对应于 cvArray,cvMat,IplImage
white=np.uint8([[[255,255,255]]])
white_hsv=cv2.cvtColor(white,cv2.COLOR_BGR2HSV)
print(white_hsv)
可以分别用 [H-100,100,100] 和 [H+100,255,255] 做上下阈值。
下边是一些常见颜色的H值范围。
-30<=h<30, 红色
30<=h<90, 黄色
90<=h<150,绿色
150<=h<210,青色
210<=h<270,蓝色
270<=h<330,品红色