周总结---OpenCV学习: 颜色空间转换

学习如何进行图片的颜色空间转换,视频中追踪特定颜色的物体。

 

目标

  • 颜色空间转换,如BGR↔Gray,BGR↔HSV等

  • 追踪视频中特定颜色的物体

  • OpenCV函数:cv2.cvtColor(), cv2.inRange()

 

教程

颜色空间转换

import cv2

img = cv2.imread('xxa.Jpeg')
#转换为灰度图   cv2.cvtColor()用来进行颜色模型转换,参数1是要转换的图片,参数2是转换模式
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#展示两种图片
cv2.imshow('img',img)
cv2.imshow('gray',img_gray)
cv2.waitKey(0)

cv2.cvtColor()用来进行颜色模型转换,参数1是要转换的图片,参数2是转换模式, COLOR_BGR2GRAY表示BGR→Gray,可用下面的代码显示所有的转换模式:

flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)

 

视频中特定颜色物体追踪

HSV是一个常用于颜色识别的模型,相比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. 只显示蓝色物体

 

原码:
import cv2
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

 

颜色如何获取?

其中,bitwise_and()函数暂时不用管,后面会讲到。那蓝色的HSV值的上下限lower和upper范围是怎么得到的呢?其实很简单,我们先把标准蓝色的BGR值用cvtColor()转换下:

blue = np.uint8([[[255, 0, 0]]])
hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
print(hsv_blue)  # [[[120 255 255]]]

结果是[120, 255, 255],所以,我们把蓝色的范围调整成了上面代码那样。

 

小结

  • cv2.cvtColor()函数用来进行颜色空间转换,常用BGR↔Gray,BGR↔HSV。

  • HSV颜色模型常用于颜色识别。要想知道某种颜色在HSV下的值,可以将它的BGR值用cvtColor()转换得到。

 

 

练习

  1. 尝试在视频中同时提取红色、蓝色、绿色的物体。

     

    import cv2
    import numpy as np

    #打开摄像头
    capture = cv2.VideoCapture(0)

    #蓝色范围
    lower_blue = np.array([100,110,110])
    upper_blue = np.array([130,255,255])
    #红色范围
    lower_red = np.array([0,110,110])
    upper_red = np.array([10,255,255])
    #绿色范围
    lower_green = np.array([50,110,110])
    upper_green = np.array([70,255,255])

    while(True):
       ret,frame = capture.read()
       hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
       mask = cv2.inRange(hsv, lower_blue, upper_blue) + cv2.inRange(hsv, lower_red, upper_red) +  cv2.inRange(hsv, lower_green, upper_green)
       res = cv2.bitwise_and(frame, frame, mask=mask)
       cv2.imshow('res',res)

       if cv2.waitKey(1) == ord('q'):
           break

     

  2.  

 

posted @ 2021-06-03 18:04  西西里啊  阅读(162)  评论(0编辑  收藏  举报