又是学习OpenCV的一天,我真的越来越喜欢它了,哈哈,不好意思哈!言归正传,这一章节主要讲的是颜色空间的转换。
学习目标是:
按照官方教程实现了视频捕捉,但是发现掩模不是只显示蓝色的物体,一度以为程序上出现问题,用不同颜色物体测试后发现,原来是掩模的阈值设置的有问题,教程上的阈值是捕捉红色的阈值。找到问题后,希望做一个可以灵活选择捕捉颜色的功能,就想到前面学习的拖拽条功能。一方面可以直观的学习和感受一下HSV的颜色空间,另一方面,可以总结出常用的颜色的阈值范围,列出表格,后续使用起来就方便很多。因此,我把官方教程的例子扩展了一下。
#读入一张图片
o = cv.imread('color24.jpg')
img = cv.resize(o,(380,380),interpolation=cv.INTER_CUBIC)
cv.namedWindow('img')
def nothing(x):
pass
#if not cap.isOpened():
#print('camera cannot open')
#exit()
lower_h = cv.createTrackbar('lower_h','img',0,255,nothing)
upper_h = cv.createTrackbar('upper_h','img',0,255,nothing)
lower_s = cv.createTrackbar('lower_s','img',0,255,nothing)
upper_s = cv.createTrackbar('upper_s','img',0,255,nothing)
lower_v = cv.createTrackbar('lower_v','img',0,255,nothing)
upper_v = cv.createTrackbar('upper_v','img',0,255,nothing)
def get_hsv():
h_lower = cv.getTrackbarPos('lower_h','img')
h_upper = cv.getTrackbarPos('upper_h','img')
s_lower = cv.getTrackbarPos('lower_s', 'img')
s_upper = cv.getTrackbarPos('upper_s', 'img')
v_lower = cv.getTrackbarPos('lower_v', 'img')
v_upper = cv.getTrackbarPos('upper_v', 'img')
lower_hsv = np.array([h_lower,s_lower,v_lower])
upper_hsv = np.array([h_upper,s_upper,v_upper])
return lower_hsv,upper_hsv
while(1):
#一帧帧的捕捉视频
lower_hsv, upper_hsv=get_hsv()
#转成HSV
hsv = cv.cvtColor(img, cv.COLOR_RGB2HSV)
#定义拾取到蓝色在HSV中的范围:lower_blue\upper_blue
#做掩模,在图像中只得到蓝色的部分
mask =cv.inRange(hsv,lower_hsv,upper_hsv)
#再把掩模和原图像AND在一起,与运算
res = cv.bitwise_and(img, img, mask=mask)
cv.imshow('original',img)
cv.imshow('mask',mask)
cv.imshow('res',res)
k = cv.waitKey(5) & 0xFF
if k ==27:
break
cv.destroyAllWindows()
这里稍微说一下RGB颜色空间和HSV颜色空间的定义和区别。
兰 | C青 | G绿 | Y黄 | R红 | M品红 | |
---|---|---|---|---|---|---|
lower_h | -16(164) | 21 | 42 | 86 | 112 | 133 |
upper_h | 21 | 42 | 86 | 112 | 133 | 164 |
lower_s | 0 | 0 | 0 | 0 | 0 | 0 |
upper_s | 255 | 255 | 255 | 255 | 255 | 255 |
lower_v | 0 | 0 | 0 | 0 | 0 | 0 |
upper_v | 255 | 255 | 255 | 255 | 255 | 255 |
也不是特别精准,可以起到一定的借鉴作用,具体提取颜色的[h,s,v],作为超参数需要调试和标定,大家要有一定耐心哈!
我们可以找个具有图形的图片先测试一下。
1.首先登场的是,黄色为代表的,非著名动画人物比卡丘
民那桑,效果不错吧,哈哈!记下HSV的阈值,后面可以继续在视频中跟踪到可爱的化身比卡丘君。
还是回归官网教程,用视频做颜色捕捉,因为所在环境光照比较强,而且是笔记本摄像头,所以电流波动和干扰比较大,其实可以通过滤波实现画面的优化,但这里重点不是说这些操作,后面学到了,我会再写出来。
视频是以一个色卡随机展示一些颜色,从画面中找出蓝色的部分,结果基本可以接受。蓝色的区域用红色线标出来了。
这一章节内容基本到这了,我会继续学习,不定期更新,先给自己打打气,哈哈,继续学习去了!