opencv 实现颜色空间转换 特定颜色物体追踪

颜色空间转换

HSV简介

HSV是一个常用于颜色识别的模型,相比BGR更易区分颜色。H表示色调(Hue),S表示饱和度(Saturation),V表示明度(Value)。
OpenCV中色调H范围为[0,179],饱和度S是[0,255],明度V是[0,255]。虽然H的理论数值是0°~360°,但8位图像像素点的最大值是255,所以OpenCV中除以了2,某些软件可能使用不同的尺度表示,所以同其他软件混用时,记得归一化。

opencv中颜色空间转换

cv.cvtColor()用来进行颜色模型转换,参数1是要转换的图片,参数2是转换模式。
BGR -> Gray
cv.cvtColor(img, cv.COLOR_BGR2GRAY)
BGR -> HSV
cv.cvtColor(img, cv.COLOR_BGR2HSV)
其它情况请举一反三

颜色转换本质

颜色转换其实是数学运算,如灰度化最常用的是:
gray = R * 0.299 + G * 0.587 + B * 0.114

视频中特定颜色物体追踪

HSV是一个常用于颜色识别的模型,相比BGR更易区分颜色,转换模式用COLOR_BGR2HSV表示。

算法流程

  1. 捕获视频中的一帧
  2. 从BGR转换到HSV
  3. 提取蓝色范围的物体
  4. 只显示蓝色物体

代码实现

import cv2 as cv 
import numpy as np 

capture = cv.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 = cv.cvtColor(frame, cv.COLOR_BGR2HSV)

    # 3.inRange():介于lower/upper之间的为白色,其余黑色
    mask = cv.inRange(hsv, lower_blue, upper_blue)

    # 4.只保留原图中的蓝色部分
    res = cv.bitwise_and(frame, frame, mask=mask)

    cv.imshow('frame', frame)
    cv.imshow('mask', mask)
    cv.imshow('res', res)

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

实验结果(res)

成功捕获了蓝色图像

如何得到蓝色的HSV的上下限lower和upper范围

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

posted on 2020-03-28 20:21  我坚信阳光灿烂  阅读(651)  评论(0编辑  收藏  举报

导航