之前学的都比较简单,今天学的稍微有点有趣了开心。
关键代码——
import cv2 as cv
import numpy as np
def extract_object_demo(): # 根据颜色跟踪目标物体
capture = cv.VideoCapture(0)
while(True):
ret, frame = capture.read()
if ret == False: # 视频帧显示完成退出循环
break
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV) # 将色彩空间从BGR转化为HSV,其实也可以直接用BGR,只要颜色范围是对应的就行
lower_hsv = np.array([0, 0, 46]) # 灰色这个颜色分别在三个通道范围的最低值
upper_hsv = np.array([180, 43, 220]) # 灰色这个颜色在三个通道范围的最高值
mask = cv.inRange(hsv, lowerb = lower_hsv, upperb = upper_hsv) # 该函数将在参数值范围内的目标物体提取出来,并返回一个二值图像,其中目标物体为白色,其余物体为黑色。但该函数的效果并不理想,光线就可以造成非常大的误差。
frame = cv.flip(frame, 1)
cv.imshow("Original Frame", frame)
cv.imshow("Mask", frame)
c = cv.waitKey(10)
if c == 27:
break
def color_space_demo(image): # 色彩空间转换 我发现色彩空间的转换是无法互逆的(这个问题希望通过之后的学习能知道为什么)
gray = cv.cvtColor(image, cv.BGR2GRAY)
cv.imshow("gray", gray)
hsv = cv.cvtColor(image, cv.BGR2HSV)
cv.imshow("hsv", hsv)
yuv = cv.cvtColor(image, cv.BGR2YUV)
cv.imshow("yuv", yuv)
ycrcb = cv.cvtColor(image, cv.BGR2YCrCb)
cv.imshow("ycrcb", ycrcb)
src = cv.imread("/home/yangx/classroom.jpg")
cv.namedWindow("Input Image", cv.WINDOW_AUTOSIZE)
cv.imshow("Input Image", src)
color_space_demo()
extract_object_demo()
b, g, r = cv.split(scr) # 分离三个通道
cv.imshow("blue", b)
cv.imshow("green", g)
cv.imshow("red", r)
src[:, :, 0] = 0
src[:, :, 1] = 0
cv.imshow("Changed Image", src)
src = cv.merge([b, g, r]) # 合并三个通道,注意这里的参数用数组表达
cv.imshow("Final Result", src)
cv.waitKey(0)
cv.destroyAllWindows()
注意——
cv.split()函数与src[:, :, 0] = 0有区别,前者是分离通道并转换为了一个灰度图像(即像素只由一个数值表达),而后者仍然是三通道RGB图像,只不过表示像素值的三个数某个数被改变(因此仍然是彩色图像)。
整理——
HSV色彩空间的颜色分布:
最后——
情人节小彩蛋:
祝大家2019情人节快乐呀!年年有今日,岁岁有今朝哈哈!