说明:
首先介绍一下我学习的OpenCV-Python中文官方文档(引用该文档的前言):
写在前面的话
2014年段力辉在当时已翻译过OpenCV 3.0,但时隔五年,如今的OpenCV 4.1中许多函数和内容已经有所更新,因此有必要对该官方文档再进行一次翻译。
翻译过程中难免有所疏漏,如发现错误,希望大家指出,谢谢支持。
OpenCV-Python Tutorials英文官方文档:
https://docs.opencv.org/master/d6/d00/tutorial_py_root.html
其次介绍以下学习笔记的主要内容:
鉴于该文档已经相当完整,我所整理的笔记主要包含对文档内容的理解和拓展。大家在学习文档时可以将该笔记作为参考,希望它可以对你有帮助。
为了改变色彩空间,我们首先要知道什么是色彩空间。
“色彩空间”一词源于西方的“Color Space”,又称作色域,色彩学中,人们建立了多种色彩模型,以一维、二维、三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间。我们经常用到的色彩空间主要有RGB、CMYK、Lab等。
这里我们主要使用RGB和HSV两种色彩空间。前者以加法混色为基础,类似于三色光的不同组合。而后者以减法混色为基础,类似于三颜色的不同组合。
特别地,HSV的色相范围为[0,179],饱和度范围为[0,255],明度范围为[0,255]。不同的软件使用不同的规模。因此,如果你要将OpenCV值和它们比较,你需要将这些范围标准化。
在我们了解了什么是色彩空间之后,我们需要知道如何改变色彩空间。而为了改变色彩空间,我们就要用到cv.cvtColor()函数。
函数解析:
cv.cvtColor(input_image,flag)函数需要我们提供待改变色彩空间的图片input_image和色彩空间转换标志flag。在提供它们之后,我们就可以得到已改变色彩空间的图片返回值。
代码示例:
# 获取所有色彩空间转换标志
import cv2 as cv
flags = [i for i in dir(cv) if i.startswith('COLOR_')]
print(flags)
在我们学会改变色彩空间之后,我们可以通过提取一个有颜色的对象,来达到追踪某个拥有特定颜色的对象。在我们的应用程序中,我们将尝试提取一个蓝色的对象。
目标:
创 建 一 个 应 用 程 序 以 提 取 视 频 中 的 蓝 色 对 象 。 创建一个应用程序以提取视频中的蓝色对象。 创建一个应用程序以提取视频中的蓝色对象。
步骤:
读 取 视 频 的 每 一 帧 ↓ 转 换 从 B G R 到 H S V 颜 色 空 间 ↓ 对 H S V 图 像 设 置 蓝 色 范 围 的 阈 值 ↓ 单 独 提 取 蓝 色 对 象 \\读取视频的每一帧\\ \downarrow\\转换从BGR到HSV颜色空间\\ \downarrow\\对HSV图像设置蓝色范围的阈值\\ \downarrow\\单独提取蓝色对象 读取视频的每一帧↓转换从BGR到HSV颜色空间↓对HSV图像设置蓝色范围的阈值↓单独提取蓝色对象
代码示例:
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
# 读取帧
_,frame = cap.read()
# 转换颜色空间 BGR 到 HSV
hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
# 定义HSV 中蓝色的范围
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# 设置HSV的阙值使得只取得蓝色
mask = cv.inRange(hsv,lower_blue,upper_blue)
#将掩膜和图像逐像素相加
res = cv.bitwise_and(frame,frame,mask=mask)
cv.imshow('frame',frame)
cv.imshow('mask',mask)
cv.imshow('res',res)
k = cv.waitKey(5) & 0xFF
if k == 27:
break
cv.destroyAllWindows()
使用相同的函数cv.cvtColor()。你只需传递你想要的BGR值,而不是传递图像。
代码示例:
# 查找绿色的HSV值
green = np.uint8([[[0,255,0]]])
hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
print(hsv_green)
现在把[H- 10,100,100]
和[H+ 10,255, 255]
分别作为下界和上界,就得到了HSV中绿色的范围。
除了这个方法之外,你可以使用任何图像编辑工具(如GIMP或任何在线转换器)来查找这些值,但是不要忘记调整HSV范围。
在实践过程中,上述方法不是十分实用,如何恰当的追踪HSV值,仍待考究。
尝试找到一种方法来提取多个彩色对象,例如,同时提取红色,蓝色,绿色对象。
(待解决)
色彩空间:https://baike.baidu.com/item/%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4/4615427?fr=aladdin
stackoverflow:https://stackoverflow.com
gmip:https://www.gimp.org