08-opencv-python-颜色空间转换(物体跟踪)

 

在HSV颜色空间中要比BGR空间中更容易表示一个特定的颜色。

在Opencv的HSV格式中,H(色彩/色度)的取值范围是[0,179],S(饱和度)的取值范围是[0,255],V(亮度)的取值范围是[0,255]。但是不同的软件使用的hsv的格式可能会不同(有的H的取值范围是0-360),要记得归一化处理

我们可以利用这一个特点来提取一个特定颜色的物体:

下面的程序提取的是一个蓝色的物体(我的手机):

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while True:
    ret ,frame = cap.read()
    cv2.namedWindow("frame", 0)
    cv2.resizeWindow("frame", 500, 400)
    cv2.namedWindow("mask", 0)
    cv2.resizeWindow("mask", 500, 400)
    cv2.namedWindow("res", 0)
    cv2.resizeWindow("res", 500, 400)

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    lower_blue = np.array([0,35,139])
    upper_blue = np.array([87,245,255])
    mask = cv2.inRange(hsv,lower_blue,upper_blue)
    res = cv2.bitwise_and(frame,frame,mask=mask)

    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

好的那么问题来了,我是怎么知道这个蓝色的颜色的hsv的范围,大家可以借鉴一下这个程序(由于我对这个格式还是比较陌生,所以我从另外一片博客找到了这个代码,我修改了一下)

找到特定颜色的hsv

import cv2
import numpy as np
cap = cv2.VideoCapture(0)
# 滑动条的回调函数,获取滑动条位置处的值
def empty(a):
    h_min = cv2.getTrackbarPos("Hue Min", "TrackBars")
    h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
    s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
    s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
    v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
    v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
    return h_min, h_max, s_min, s_max, v_min, v_max

# 创建一个窗口,放置6个滑动条
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars", 640, 240)
cv2.createTrackbar("Hue Min", "TrackBars", 78, 125, empty)
cv2.createTrackbar("Hue Max", "TrackBars", 99, 155, empty)
cv2.createTrackbar("Sat Min", "TrackBars", 43, 43, empty)
cv2.createTrackbar("Sat Max", "TrackBars", 255, 255, empty)
cv2.createTrackbar("Val Min", "TrackBars", 46, 46, empty)
cv2.createTrackbar("Val Max", "TrackBars", 255, 255, empty)

while True:
    ret ,img = cap.read()
    imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    # 调用回调函数,获取滑动条的值
    h_min, h_max, s_min, s_max, v_min, v_max = empty(0)
    lower = np.array([h_min, s_min, v_min])
    upper = np.array([h_max, s_max, v_max])
    # 获得指定颜色范围内的掩码
    mask = cv2.inRange(imgHSV, lower, upper)
    # 对原图图像进行按位与的操作,掩码区域保留
    imgResult = cv2.bitwise_and(img, img, mask=mask)

    cv2.imshow("Mask", mask)
    cv2.imshow("Result", imgResult)

    cv2.waitKey(1)

从这个图片中找到颜色的大致范围,然后再滚轮中找到最符合的那个

如果要找特定颜色RGB值所对应的HSV的值,用下面的这个代码:

(注意是三个中括号)

import cv2
import numpy as np

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

#输出
[[[ 60 255 255]]]

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值