颜色和移动物体识别系统

颜色和移动物体识别系统
1.开发工具
Python版本:Anaconda 的python环境3.8版本
开发软件:Pycharm社区版
识别模型:深度学习模型,普通学习模型
相关模块:opencv-python=3.4.8.29模块
2.环境搭建
安装Anaconda并将路径添加到环境变量,安装Pycharm并将路径添加到环境变量,使用pip安装需要的相关模块即可。
3.程序流程
一、颜色识别系统
1)打开pycharm,创建一个文件夹和一个.py文件
在这里插入图片描述

2)导入两个库,cv2和numpy库
在这里插入图片描述

3)设置绿色和红色的高低阈值
在这里插入图片描述

4)判断是否正常打开视频
在这里插入图片描述

5)读取每一帧与当读取帧正常时
在这里插入图片描述

6)将图片转为灰色
在这里插入图片描述

7)根据颜色范围筛选红色和绿色
在这里插入图片描述

8)中值滤波处理
在这里插入图片描述

9)对两种颜色进行处理,寻找绿色和红色范围
在这里插入图片描述

10)在绿色区域画正方形并显示“Green”
在这里插入图片描述

11)在红色区域画正方形并显示“Red”
在这里插入图片描述

12)显示每一帧,等待播放,按“q”中断
在这里插入图片描述

13)如果视频播放完,自动跳出循环,窗口关闭
在这里插入图片描述

14)释放视频以及销毁所有创建的窗口
在这里插入图片描述

15)运行时示例截图
在这里插入图片描述
源码展示

import numpy as np  # 导入numpy库
import cv2  # 导入opencv-python库即cv2库

lower_green = np.array([35, 110, 106])  # 绿色范围低阈值
upper_green = np.array([77, 255, 255])  # 绿色范围高阈值
lower_red = np.array([0, 127, 128])  # 红色范围低阈值
upper_red = np.array([10, 255, 255])  # 红色范围高阈值
# 需要更多颜色,可以去百度一下HSV阈值!
cap = cv2.VideoCapture("2.mp4")  # 打开视频文件
num = 0
while (cap.isOpened()):  # 是否正常打开视频
    ret, frame = cap.read()  # 读取每一帧
    if ret == True:  # 判断读取帧正确时
        hsv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)  # 将图片转为灰色以便后面处理
        mask_green = cv2.inRange(hsv_img, lower_green, upper_green)  # 根据颜色范围筛选绿色
        mask_red = cv2.inRange(hsv_img, lower_red, upper_red)  # 根据颜色范围筛选红色
        mask_green = cv2.medianBlur(mask_green, 7)  # 中值滤波
        mask_red = cv2.medianBlur(mask_red, 7)  # 中值滤波
        mask = cv2.bitwise_or(mask_green, mask_red)  # 对两种颜色进行处理
        mask_green, contours, hierarchy = cv2.findContours(mask_green, cv2.RETR_EXTERNAL,
                                                           cv2.CHAIN_APPROX_NONE)  # 寻找绿色范围
        mask_red, contours2, hierarchy2 = cv2.findContours(mask_red, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  # 寻找红色范围
        for cnt in contours:
            (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), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
            # 在绿色区域画正方形并显示Green
        for cnt2 in contours2:
            (x2, y2, w2, h2) = cv2.boundingRect(cnt2)
            cv2.rectangle(frame, (x2, y2), (x2 + w2, y2 + h2), (0, 255, 255), 2)
            cv2.putText(frame, "Red", (x2, y2 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
            # 在红色区域画正方形并显示Green
        cv2.imshow("dection", frame)  # 显示每一帧
        if cv2.waitKey(20) & 0xFF == ord("q"):  # 类似中断播放的按键,按q跳出循环终止播放
            break
    else:
        break
cap.release()  # 释放视频
cv2.destroyAllWindows()  # 将创建的所有的窗口毁灭

二、移动物体识别系统
1)打开pycharm,创建一个文件夹和一个.py文件
在这里插入图片描述

2)导入cv2库,该系统只需要一个cv2库
在这里插入图片描述

3)读取视频的路径
在这里插入图片描述

4)找出视频的长和宽,并且输出
在这里插入图片描述

5)给椭圆形描点并赋值给变量,并给background赋值
在这里插入图片描述

6)判断能否正确读取视频流
在这里插入图片描述

7)读取视频并判断视频是否结束
在这里插入图片描述

8)对帧进行预处理,先转灰度,再进行高斯滤波
在这里插入图片描述

9)将第一帧设置为整个输入的背景
在这里插入图片描述

10)对于每个从背景之后读取的帧都会计算其与背景之间的差异,并得到一个差分图
在这里插入图片描述

11)应用阈值来得到一幅黑白图像,并通过下面代码来膨胀图像,从而对孔和缺陷进行归一化处理
在这里插入图片描述

12)对移动的物体显示矩形框
在这里插入图片描述

13)播放视频并且按“q”退出视频
在这里插入图片描述

14)如果视频播放结束。跳出循环并关闭窗口
在这里插入图片描述

15)释放视频和销毁所有创造的窗口
在这里插入图片描述

16)运行示例截图
在这里插入图片描述
源码展示

import cv2  # 导入opencv-python库即cv2库

camera = cv2.VideoCapture("5.mp4")  # 读取视频路径
size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)), int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)))  # 找出视频的长和宽并赋给变量
print('size:' + repr(size))  # 输出图片的长和宽
es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 4))  # 以椭圆形描点并赋值给变量
background = None  # 给background赋予初始值None
while (camera.isOpened()):  # 能否正确读取视频流
    grabbed, frame_lwpCV = camera.read()
    if grabbed == True:
        gray_lwpCV = cv2.cvtColor(frame_lwpCV, cv2.COLOR_BGR2GRAY)  # 对帧进行预处理,先转灰度图,再进行高斯滤波。
        gray_lwpCV = cv2.GaussianBlur(gray_lwpCV, (21, 21),0)  # 用高斯滤波进行模糊处理,进行处理的原因:每个输入的视频都会因自然震动、光照变化或者摄像头本身等原因而产生噪声。对噪声进行平滑是为了避免在运动和跟踪时将其检测出来。
        # 将第一帧设置为整个输入的背景
        if background is None:
            background = gray_lwpCV
            continue
        # 对于每个从背景之后读取的帧都会计算其与背景之间的差异,并得到一个差分图(different map)。
        # 还需要应用阈值来得到一幅黑白图像,并通过下面代码来膨胀(dilate)图像,从而对孔(hole)和缺陷(imperfection)进行归一化处理
        diff = cv2.absdiff(background, gray_lwpCV)
        diff = cv2.threshold(diff, 148, 255, cv2.THRESH_BINARY)[1]  # 二值化阈值处理
        diff = cv2.dilate(diff, es, iterations=2)  # 形态学膨胀
        image, contours, hierarchy = cv2.findContours(diff.copy(), cv2.RETR_EXTERNAL,
                                                      cv2.CHAIN_APPROX_SIMPLE)  # 该函数计算一幅图像中目标的轮廓
        # 显示矩形框
        for c in contours:
            if cv2.contourArea(c) < 15:  # 对于矩形区域,只显示大于给定阈值的轮廓,所以一些微小的变化不会显示。对于光照不变和噪声低的摄像头可不设定轮廓最小尺寸的阈值
                continue
            (x, y, w, h) = cv2.boundingRect(c)  # 该函数计算矩形的边界框
            cv2.rectangle(frame_lwpCV, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 画出有移动物体的矩形
        cv2.imshow('contours', frame_lwpCV)  # 播放视频
        key = cv2.waitKey(20) & 0xFF
        # 按'q'健退出循环
        if key == ord('q'):
            break
    else:
        break
camera.release()  # 释放视频
cv2.destroyAllWindows()  # 将创建的所有的窗口毁灭

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萧鼎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值