一、颜色空间转换

import cv2
import numpy as np
img = cv2.imread('lena.jpg')
# 转换成灰度图
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('img', img)
cv2.imshow('gray', img_gray)
cv2.waitKey(0)

颜色转换其实是数学运算,如灰度化最常用的是:gray = R* 0.299 + G* 0.587 + B * 0.114

二、视频中特定颜色物体追踪

HSV:色调(H),饱和度(S),明度(V)。对光照的变换并不是很敏感,相比于BGR更易于区分颜色,常用于颜色识别的模型。转换模式用COLOR_BGR2HSV表示

OpenCV中色调H的范围为[0, 179],饱和度S是[0, 255],明度V是[0, 255]。虽然H的理论数值是0°~360°,但8位图像像素点的最大值是255,所以OpenCV除以了2.

现在,我们实现一个使用HSV来只显示视频中蓝色物体的例子,步骤如下:

  1. 捕获视频中一帧

  2. 从BGR转换到HSV

  3. 提取蓝色范围的物体

  4. 只显示蓝色物体

# 蓝色的hsv值
blue = np.uint8([[[255, 0, 0]]])
hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
print(hsv_blue)
[[[120 255 255]]]
# 绿色的hsv值
green = np.uint8([[[0, 255, 0]]])
hsv_green = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
print(hsv_green)
[[[ 60 255 255]]]
# 红色的hsv值
red = np.uint8([[[0, 0, 255]]])
hsv_red = cv2.cvtColor(red, cv2.COLOR_BGR2HSV)
print(hsv_red)
[[[  0 255 255]]]
import numpy as np

capture = cv2.VideoCapture(0)

# 蓝色的范围,不同光照条件下不一样,可灵活调整
lower_blue = np.array([100, 110, 110])
upper_blue = np.array([130, 255, 255]) while(True):
# 1. 捕获视频中的一帧
ret, frame = capture.read() # 2.从BGR转换到HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 3. inRange(): 介于lower/upper之间的白色,其余黑色
mask = cv2.inRange(hsv, lower_blue, upper_blue) # 4. 只保留原图中的蓝色部分
res = cv2.bitwise_and(frame, frame, mask=mask) cv2.imshow('frame', frame)
cv2.imshow('mask', mask)
cv2.imshow('res', res) if cv2.waitKey(1) == ord('q'):
break

当然,你也可以只显示视频中红色或者绿色的物体。只要修改一下HSV值的上下限即可。

三、在视频中同时提取红、绿、蓝色的物体

capture = cv2.VideoCapture(0)

# 蓝色的范围,不同光照条件下不一样,可灵活调整
lower_blue = np.array([100, 110, 110])
upper_blue = np.array([130, 255, 255]) # 绿色的范围
lower_green = np.array([40, 110, 110])
upper_green = np.array([70, 255, 255]) # 红色的范围
lower_red = np.array([160, 110, 110])
upper_red = np.array([179, 255, 255]) while(True):
# 1. 捕获视频中的一帧
ret, frame = capture.read() # 2.从BGR转换到HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 3. inRange(): 介于lower/upper之间的白色,其余黑色
mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
mask_green = cv2.inRange(hsv, lower_green, upper_green)
mask_red = cv2.inRange(hsv, lower_red, upper_red) mask = mask_blue + mask_green + mask_red # 4. 只保留原图中的蓝色部分
res = cv2.bitwise_and(frame, frame, mask=mask) cv2.imshow('frame', frame)
cv2.imshow('mask', mask)
cv2.imshow('res', res) if cv2.waitKey(1) == ord('q'):
break

四、小结

  • cv2.cvtColor()函数用来进行颜色空间转换,常用BGR↔RGB,BGR↔Gray,BGR↔HSV
  • HSV颜色模型常用于颜色识别,要想知道某种颜色在HSV下的值,可以将它的BGR值用cvtColor()转换得到

参考网址:https://tianchi.aliyun.com/course/courseConsole?courseId=40992&chapterIndex=1&sectionIndex=5

最新文章

  1. Runnable,Thread实现多线程以及Runnable的同步资源共享
  2. 【iCore3 双核心板】例程十八:USB_VCP实验——虚拟串口
  3. 日常笔记 ---- 图形学-Frenel函数材质球实现方式
  4. BNUOJ 13105 nim博弈
  5. C#的回调被C++调用
  6. 【iCore2双核心板视频教程】 AD模块(iM_AD_GP和iM_AD_SYNC)介绍及数据采集实验三
  7. MVC4之ModelBinder-模型绑定
  8. Changing the Overridden Method’s Characteristics
  9. storm 入门
  10. JAVA与ABA问题
  11. hdoj 3635 Dragon Balls【并查集求节点转移次数+节点数+某点根节点】
  12. linq的一些用法总结
  13. navicat:cannot create oci environment
  14. FileInputStream和FileOutputStream详解
  15. 关于SPF记录的说明
  16. Springboot整合log4j2【详细步骤】
  17. 一个CSS+jQuery的放大缩小动画效果
  18. #if和#ifdef的区别
  19. 8-Flink中的窗口
  20. re 模块 分组特别说明

热门文章

  1. 编写Python脚本进行ARP欺骗
  2. Spring Security测试代码
  3. yolo
  4. Linux内存管理 (10)缺页中断处理【转】
  5. 学习awk命令的使用
  6. python3+selenium入门15-执行JavaScript
  7. hibernate映射关系(多对多)
  8. kali sudo apt install 无法定位软件包
  9. corba/ice/web service/com+
  10. 正版phpstorm,webstorm,goland(Jetbrains系列都可以)免费激活步骤(图文详解)(亲测有效)