python-opencv练习:尝试找到一种方法来提取一个以上的彩色物体,例如,同时提取红色、蓝色和绿色物体。

从摄像机捕获

import cv2 as cv
import numpy as np

cap = cv.VideoCapture(0)
while(1):
    # Take each frame
    _, frame = cap.read()
    # 转换BGR色彩到HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # 定义HSR中蓝色空间的范围
    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([10, 255, 255])
    mask_R1 = cv.inRange(hsv, lower_red1, upper_red1)
    # 红色范围2
    lower_red2 = np.array([156, 43, 46])
    upper_red2 = np.array([180, 255, 255])
    mask_R2 = cv.inRange(hsv, lower_red2, upper_red2)
    # 使用cv相加,速度翻倍
    # 性能测试
    e1 = cv.getTickCount()
    # 使用cv相加,速度翻倍
    mask = cv.add(cv.add(mask_B,mask_G),cv.add(mask_R1,mask_R2))
    e2 = cv.getTickCount()
    print((e2 - e1)/cv.getTickFrequency())
    # 按位与运算混合蒙版和图像
    # 即保留蒙版对应位置不为0(不为黑色)的像素
    res = cv.bitwise_and(frame,frame, mask= mask)
    cv.imshow('frame',frame)
    cv.imshow('mask',mask)
    cv.imshow('res',res)
    # esc退出
    k = cv.waitKey(5) & 0xFF
    if k == 27:
        break
# 自动销毁所有窗口
cv.destroyAllWindows()

从视频文件捕获

# 从视频文件捕获
import cv2 as cv
import numpy as np

cap = cv.VideoCapture("HSV捕获红绿蓝样本.mp4")
while cap.isOpened():
    # Take each frame
    ret, frame = cap.read()
    if not ret:
        print("播放完毕,退出")
        break
    # 转换BGR色彩到HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # 定义HSR中蓝色空间的范围
    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([10, 255, 255])
    mask_R1 = cv.inRange(hsv, lower_red1, upper_red1)
    # 红色范围2
    lower_red2 = np.array([156, 43, 46])
    upper_red2 = np.array([180, 255, 255])
    mask_R2 = cv.inRange(hsv, lower_red2, upper_red2)
    # 性能测试
    e1 = cv.getTickCount()
    # 使用cv相加,速度翻倍
    mask = cv.add(cv.add(mask_B,mask_G),cv.add(mask_R1,mask_R2))
    e2 = cv.getTickCount()
    print((e2 - e1)/cv.getTickFrequency())
    # 按位与运算混合蒙版和图像
    # 即保留蒙版对应位置不为0(不为黑色)的像素
    res = cv.bitwise_and(frame,frame, mask= mask)
    cv.imshow('frame',frame)
    cv.imshow('mask',mask)
    cv.imshow('res',res)
    # esc退出
    k = cv.waitKey(5) & 0xFF
    if k == 27:
        break
# 自动销毁所有窗口
cv.destroyAllWindows()

HSV色彩范围参考图

python-opencv练习:尝试找到一种方法来提取一个以上的彩色物体,例如,同时提取红色、蓝色和绿色物体。_第1张图片

你可能感兴趣的:(python,python实例,opencv,python,计算机视觉)