六、opencv-python 颜色空间转换和特定颜色追踪

1.彩色转灰度


import cv2

cap = cv2.VideoCapture(0)

cv2.namedWindow('video',cv2.WINDOW_NORMAL)


while cap.isOpened():
    ret, frame = cap.read()

    if ret:
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        cv2.imshow('video',gray)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()


2.查看所有支持的颜色空间

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


3.颜色转化其实是数学计算

#灰度化最常用的是:

gray=R*0.299+G*0.587+B*0.114


4.颜色追踪的原理

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. 只显示蓝色物体


先获取标准蓝色的hsv色值

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



以下代码实现只取蓝色

import cv2
import numpy as np

#载入图片
img = cv2.imread('d:/www2/333/222.jpg')

#转为hsv
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

#蓝色的范围,不同光照条件下不一样,可灵活调整
blue_min = np.array([110,100,100])
blue_max = np.array([130,255,255])

#inRange():介于 lower/upper 之间的为白色,其余黑色
mask = cv2.inRange(img_hsv,blue_min,blue_max)

#只保留原图中的蓝色部分
dst = cv2.bitwise_and(img,img,mask=mask)

cv2.imshow('img',img)
cv2.imshow('img_hsv',img_hsv)
cv2.imshow('mask',mask)
cv2.imshow('dst',dst)

cv2.waitKey(0)


5.练习:实现同时获取图片中的红黄蓝

import cv2
import numpy as np

img = cv2.imread('d:/www2/333/222.jpg')

img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

blue = np.uint8([[[255,0,0]]])
blue_hsv = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)

print(blue_hsv)#[[[120 255 255]]]

red = np.uint8([[[0,0,255]]])
red_hsv = cv2.cvtColor(red, cv2.COLOR_BGR2HSV)

print(red_hsv)#[[[  0 255 255]]]

blue_min = np.array([100,110,110])
blue_max = np.array([130,255,255])

red_min = np.array([170,150,90])
red_max = np.array([180,255,255])

yellow_min = np.array([26,110,110])
yellow_max = np.array([34,255,255])

blue_mask = cv2.inRange(img_hsv,blue_min,blue_max)

red_mask = cv2.inRange(img_hsv,red_min,red_max)

yellow_mask = cv2.inRange(img_hsv,yellow_min,yellow_max)


# print(blue_mask)
bite_and = cv2.bitwise_or(blue_mask,red_mask)
bite_and = cv2.bitwise_or(bite_and,yellow_mask)
cv2.imshow('a',img)
# cv2.imshow('b',blue_mask)
# cv2.imshow('c',red_mask)
# cv2.imshow('d',yellow_mask)
# cv2.imshow('e',bite_and)

dst = cv2.bitwise_and(img,img,mask=bite_and)
cv2.imshow('f',dst)

cv2.waitKey(0)


6.附图,颜色空间取值

20190815150254107.png

打赏

看恩吧
网站不承担任何有关评论的责任
  • 最新评论
  • 总共条评论
取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦