opencv中有超过150中颜色空间转换方法。最常用的BGR<-->灰色和BGR<-->HSV。

BGR转灰度:cv.COLOR_BGR2GRAY

BGR转HSV:cv.COLOR_BGR2HSV

import cv2 as cv
flags=[i for i in div(cv) if i.startwith('COLOR_')]
print(flags)

 注意:HSV的色相范围为[0,179],饱和度范围为[0,255],值范围为[0,255]。

cv.cvtColor(src,code,dst,descn)

  • src:输入图像,可以是Numpy数组或Opencv中的Mat对象。
  • code:颜色空间转换代码,表示目标色彩空间。可以使用opencv中的cv.COLOR_*常量来指定,如cv.COLOR_BGR2GRAY表示将BGR彩色图像转换为灰度图像。
  • dst:可选参数,输出图像,可以是Numpy数组或Mat对象。如未提供,将会创建一个新的图像来保存转换后的结果。
  • dstCn:可选参,目标图像的通道数。默认值为0,表示与输入图像通道数保持一致。
import cv2 as cv

img=cv.imread('./images/lena.jpeg')
# 将彩色图像转换为灰色图像
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
print(gray.shape)
print(gray)
cv.imshow('gray',gray)
# 将灰色图像转换为彩色图像
original=cv.cvtColor(gray,cv.COLOR_GRAY2BGR)
print(original.shape) # (256, 256, 3)
print(original[:,:,2])
print((original[:,:,0]==original[:,:,2]).all()) #True
cv.imshow('orginal',original)
cv.waitKey(0)
cv.destroyAllWindows()

提取一个蓝色的对象。方法如下:取视频的每一帧,转换BGR到HSV颜色空间。对HSV图像设置蓝色范围的阈值,现在单独提取蓝色对象。

import cv2 as cv
import numpy as np

cap=cv.VideoCapture(0)
while cap.isOpened():
    # 读取帧
    ret,frame=cap.read()
    if not ret:
        break
    # 转换彩色空间 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.inrange()函数的作用是可以提取想要的颜色,并把该颜色的区域设置为白色,其余的设置为黑色。

如何找到要追踪的HSV值?

使用cv.cvtColor(),只需传递想要的BGR值,而不是传递图像。如:要查找绿色的HSV值。

import numpy as np
import cv2 as cv

green=np.uint8([[[0,255,0]]])
hsv_green=cv.cvtColor(green,cv.COLOR_BGR2HSV)
print(hsv_green) # [[[ 60 255 255]]]

现在把[H-10,100,100]和[H+10,255,255]分别作为下界和上届。除了这个方法之外,可以使用任何图像编辑工具(如GIMP或任何在线转换器)来查找这些值,但是不要忘记调整HSV范围。

 

 posted on 2024-05-02 16:25  会飞的金鱼  阅读(69)  评论(0)    收藏  举报