1.背景
阅读官方文档/手册,学习openCV的过程中遇到的练习题,记录一下。
练习题
- 尝试找到一种方法来提取多个彩色对象,例如,同时提取红色,蓝色,绿色对象。
2. 代码部分
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while (1):
# 读取帧
_, frame = cap.read()
# 转换颜色空间 BGR 到 HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# 定义HSV中蓝色的范围
lower_blue = np.array([106, 43, 46])
upper_blue = np.array([130, 255, 255])
# 设置HSV的阈值使得只取蓝色
mask_B = cv.inRange(hsv, lower_blue, upper_blue)
lower_green = np.array([35, 43, 46])
upper_green = np.array([77, 255, 255])
mask_G = cv.inRange(hsv, lower_green, upper_green)
lower_red1 = np.array([0, 43, 46])
upper_red1 = np.array([20, 255, 255])
mask_R1 = cv.inRange(hsv, lower_red1, upper_red1)
lower_red2 = np.array([150, 43, 46])
upper_red2 = np.array([180, 255, 255])
mask_R2 = cv.inRange(hsv, lower_red2, upper_red2)
mask=mask_B+mask_G+mask_R1+mask_R2
#mask = mask_R1 + mask_R2
# dst = cv.inRange( src, lowerb, upperb[, dst] )
# 将掩膜和图像逐像素相加
res = cv.bitwise_and(frame, frame, mask=mask)
# dst = cv.bitwise_and( src1, src2[, dst[, mask]] )
cv.imshow('frame', frame)
cv.imshow('mask', mask)
cv.imshow('res', res)
k = cv.waitKey(5) & 0xFF
if k == 27:
break
cv.destroyAllWindows()
3. 演示效果
用Ipad测试了一下,效果还不错,范围内噪音也比较少。
实现方法肯定不止一种,如果您有其他方法,欢迎留言交流~