035-OpenCV HSV颜色识别视频

话不多说,上代码,看结果。

import cv2           # 导入库
import numpy as np

font = cv2.FONT_HERSHEY_SIMPLEX
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))  # 矩形结构
'''
    cap = cv2.VideoCapture(filename)
# capture有捕获的意思,上面函数的意思就是从文件中捕获视频
# filename是文件名,.py文件和视频放在一个文件夹时输入文件名即可
# 不在一个文件夹时还要加上视频所在的路径
'''
cap = cv2.VideoCapture('2.mp4')
'''
#视频实际上是一帧一帧图像组成的,读取视频就是循环读取图片
#要想循环读取,得先打开文件吧,打开文件后得判断一下是否打开了吧
    cv2.VideoCapture().isOpened(),也就是cap.isOpened()
#判断是否正常打开文件,正确就返回个True
'''

'''
    cv2.namedWindow(winname,flags)
    #  winname是窗口名字
    #  flags为窗口显示方式,cv2.WINDOW_NORMAL为正常显示,可以调整大小
    # cv2.WINDOW_AUTOSIZE显示原图片的大小,用户不能调整大小
    '''
cv2.namedWindow('2.mp4', cv2.WINDOW_NORMAL)

lower_green = np.array([35, 43, 46])   # 颜色范围低阈值
upper_green = np.array([77, 255, 255])  # 颜色范围高阈值
lower_blue = np.array([100, 43, 46])   # 颜色范围低阈值
upper_blue = np.array([124, 255, 255])  # 颜色范围高阈值
lower_black = np.array([0, 0, 0])   # 颜色范围低阈值
upper_black = np.array([180, 255, 46])  # 颜色范围高阈值
lower_gray = np.array([0, 0, 46])   # 颜色范围低阈值
upper_gray = np.array([180, 43, 220])  # 颜色范围高阈值
lower_white = np.array([0, 0, 221])   # 颜色范围低阈值
upper_white = np.array([180, 30, 255])  # 颜色范围高阈值
lower_red = np.array([0, 43, 46])   # 颜色范围低阈值
upper_red = np.array([10, 255, 255])  # 颜色范围高阈值
# 红色或者是这个
# lower_red = np.array([156, 43, 46])   # 颜色范围低阈值
# upper_red = np.array([180, 255, 255])  # 颜色范围高阈值
lower_orange = np.array([11, 43, 46])   # 颜色范围低阈值
upper_orange = np.array([25, 255, 255])  # 颜色范围高阈值
lower_yellow = np.array([26, 43, 46])   # 颜色范围低阈值
upper_yellow = np.array([34, 255, 255])  # 颜色范围高阈值

lower_cyan = np.array([78, 43, 46])   # 青色范围低阈值
upper_cyan = np.array([99, 255, 255])  # 青色范围高阈值
lower_purple = np.array([125, 43, 46])   # 颜色范围低阈值
upper_purple = np.array([155, 255, 255])  # 颜色范围高阈值



while cap.isOpened():
    '''
        ret, frame = cap.read()
        # ret值为True或者False,是否取帧成功
        # frame为取帧的图像
    '''
    ret, frame = cap.read()
    if not ret:  # 如果取帧失败,退出循环
        print('取帧失败,退出循环')  # 输出一下好知道问题在哪(这样显得逼格高,,,)
        break
    '''
         cv2.cvtColor()
     # 颜色空间转换
     # img为要转换的图像,后者为转换的格式
     # 颜色空间有很多种,最常见的就是RGB颜色空间
     # R红色,G绿色,B蓝色,OpenCV中顺序是BGR!!!!!!!
     # [255, 0,0]是蓝色,[0, 255, 0]表示绿色,[0, 0, 255]表示红色
         HSV颜色空间
     # 也挺常用的,H是色调,S是饱和度,V是明度,具体百度就行
     # H---不同的颜色(红色/绿色/蓝色)---范围: 0~360
     # S---颜色深浅(浅红/深红)---范围: 0.0~1.0
     # V---颜色亮暗(暗红/亮红)---范围: 0.0~1.0
     # OpenCV默认的HSV范围分别是:
     # H: 0~180, S: 0~255, V: 0~255
     '''
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    '''
            cv2.inRange(src, lowerb, upperb, dst)
        # src: 输入原图或数组
        # lowerb: 低边界或者颜色阈值
        # upperb: 高边界或者颜色阈值
        # dst: 输出目标图像, 需要和原图一样的size并且类型需为CV_8U
        '''
    mask_green = cv2.inRange(hsv, lower_green, upper_green)  # 根据颜色范围删选
    mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)  # 根据颜色范围删选
    '''
        cv2.medianBlur(src, ksize, dst)
        中值滤波 一种非线性滤波, 是用像素点邻域灰度值的中值代替该点的灰度值, 可以去除脉冲噪声和椒盐噪声
    # src 要滤波的图像  dst 输出图像
    # ksize  int类型的孔径的线性尺寸, 大于1的奇数
    '''
    mask_green = cv2.medianBlur(mask_green, 7)  # 中值滤波
    mask_blue = cv2.medianBlur(mask_blue, 7)  # 中值滤波

    mask_green, contours_green, hierarchy_green = cv2.findContours(mask_green, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    mask_blue, contours_blue, hierarchy_blue = cv2.findContours(mask_blue, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

    cv2.imshow('mask_green', mask_green)
    cv2.imshow('mask_green', mask_green)
    for cnt in contours_green:
        (x, y, w, h) = cv2.boundingRect(cnt)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 2)
        cv2.putText(frame, "green", (x, y - 5), font, 0.7, (0, 255, 0), 2)
    for cnt in contours_blue:
        (x, y, w, h) = cv2.boundingRect(cnt)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 2)
        cv2.putText(frame, "blue", (x, y - 5), font, 0.7, (0, 255, 0), 2)
    '''
    cv2.imshow(winname,mat)
    # winname为显示的窗口
    # mat 需要显示的图像
    '''
    cv2.imshow('2.mp4', frame)  # 取完帧之后显示帧在窗口
    '''
    #个人理解这里这么写的原因是就像单片机八位数码管循环显示数字一样
    #如果不在每位数码管显示完数字后延时一下,数字就会飞快闪过看不清
    #在这里不延时的话就会一直卡在第一帧图像那里,所以要延时
    '''
    if cv2.waitKey(30) & 0xFF == 27:  # 按下Esc键退出
        break
cap.release()            # 释放cap
cv2.destroyAllWindows()  # 销毁所有窗口

结果如下图。
在这里插入图片描述
视频就是我用录屏录得拖动这张图片,录的效果不太好,主要关注能不能识别出球的颜色就行。
就先这样,遇到别的再补充。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值