Opencv中常用的颜色空间就三种BGR、HSV、灰度。
在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种:BGR↔Gray 和 BGR↔HSV。
我们要用到的函数是:cv.cvtColor(input_image,flag),其中 flag 就是转换类型。
对于 BGR↔Gray 的转换,我们要使用的 flag 就是cv.COLOR_BGR2GRAY。 同样对于 BGR↔HSV 的转换,我们用的 flag 就是 cv.COLOR_BGR2HSV。 你还可以通过下面的命令得到所有可用的 flag。(前面是转化前后面是转化后中间2)
Note:在 OpenCV 的 HSV 格式中,H(色彩/色度)的取值范围是 [0,179], S(饱和度)的取值范围 [0,255],V(亮度)的取值范围 [0,255]。但是不 同的软件使用的值可能不同。所以当你需要拿 OpenCV 的 HSV 值与其他软 件的 HSV 值进行对比时,一定要记得归一化(按比例统一)。
现在我们知道怎样将一幅图像从 BGR 转换到 HSV 了,我们可以利用这 一点来提取带有某个特定颜色的物体。在 HSV 颜色空间中要比在 BGR 空间 中更容易表示一个特定颜色。在我们的程序中,我们要提取的是一个蓝色的物 体。下面就是就是我们要做的几步:
从视频中获取每一帧图像
将图像转换到 HSV 空间
设置 HSV 阈值到蓝色范围。
获取蓝色物体,当然我们还可以做其他任何我们想做的事,比如:在蓝色 物体周围画一个圈。
代码如下:
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
# Take each frame
_, frame = cap.read()
# Convert BGR to HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# define range of blue color in HSV
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# Threshold the HSV image to get only blue colors
mask = cv.inRange(hsv, lower_blue, upper_blue)
# Bitwise-AND mask and original image
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()
green = np.uint8([[[0,255,0 ]]])
hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
print( hsv_green )
[[[ 60 255 255]]]
通过计算程序执行时间判断程序性能:
cv.getTickCount 函数返回从参考点到这个函数被执行的时钟数。所 以当你在一个函数执行前后都调用它的话,你就会得到这个函数的执行时间 (时钟数)。cv.getTickFrequency返回时钟频率,或者说每秒钟的时钟数。所以 你可以按照下面的方式得到一个函数运行了多少秒:
e1 = cv.getTickCount()
# your code execution
e2 = cv.getTickCount()
time = (e2 - e1)/ cv.getTickFrequency()
感觉没什么用
HSV和BGR三原色在图片信息存储的差别在哪?
呃BGR是把三种原色分开来,数值代表亮度,然后叠加,HSV将颜色,饱和度(不了解),亮度剥离出来,可能对于某些操作更方便。
1.编写一段程序实现以下功能:
代码调用电脑摄像头,寻找视野中任意颜色(自定)并具有一定大小的物体,并用矩形框处,最后显示在图像上;
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(r'C:\Users\19583\Desktop\3.mp4')
while(1):
# Take each frame
_, frame = cap.read()
# Convert BGR to HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# define range of blue color in HSV
lower_blue = np.array([42,43,46])
upper_blue = np.array([77,255,255])
# Threshold the HSV image to get only blue colors
mask = cv.inRange(hsv, lower_blue, upper_blue)
# Bitwise-AND mask and original image
res = cv.bitwise_and(frame,frame, mask= mask)
res=cv.resize(res,(500,500))
gj1=res[:,:,0].copy()#分离出色彩通道
# 腐蚀除去那些零散的绿点
ke=np.ones((5,5),dtype=int)
res=cv.erode(res,ke,iterations=3)
gj1 = cv.erode(gj1, ke, iterations=3)
d1x=0
d1y=0
d2x=0
d2y=0
for i in range(gj1.shape[0]):#遍历图像找到临界的两个点的坐标,并用他们画矩形
flag=0
for j in range(gj1.shape[1]):
if gj1[i][j]>0:
flag=1
if flag==1:
d1y=i
break
for i in range(gj1.shape[0]-1,0,-1):
flag=0
for j in range(gj1.shape[1]):
if gj1[i][j]>0:
flag=1
if flag==1:
d2y=i
break
for i in range(gj1.shape[1]):
flag=0
for j in range(gj1.shape[0]):
if gj1[j][i]>0:
flag=1
if flag==1:
d1x=i
break
for i in range(gj1.shape[0]-1,0,-1):
flag=0
for j in range(gj1.shape[1]):
if gj1[j][i]>0:
flag=1
if flag==1:
d2x=i
break
cv.rectangle(res,(d1x,d1y),(d2x,d2y),(255,0,0))
fourcc = cv.VideoWriter_fourcc(*'XVID')#保存
out = cv.VideoWriter(r'C:\Users\19583\Desktop\output.avi', fourcc, 20.0, (640, 480))
out.write(res)
cv.imshow('frame',frame)
#cv.imshow('mask',mask)
cv.imshow('res',res)
k = cv.waitKey(50) & 0xFF
if k == 27:
break
cv.destroyAllWindows()