zoukankan      html  css  js  c++  java
  • python opencv3 运动检测

    git:https://github.com/linyi0604/Computer-Vision

    思路:  开启摄像头后 设置一个当前帧为背景, 在之后检测到的帧都与背景对比不同,对不同的地方进行检测

     1 # coding:utf-8
     2 
     3 """
     4 计算帧之间的差异 考虑背景帧与其他帧之间的差异
     5 """
     6 
     7 import cv2
     8 import numpy as np
     9 
    10 # 调用摄像头
    11 camera = cv2.VideoCapture(0)
    12 
    13 
    14 kernel = np.ones((5, 5), np.uint8)
    15 background = None
    16 
    17 while True:
    18     # 读入摄像头的帧
    19     ret, frame = camera.read()
    20     # 把第一帧作为背景
    21     if background is None:
    22         background = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    23         background = cv2.GaussianBlur(background, (21, 21), 0)
    24         continue
    25     # 读入帧
    26     gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    27     # 高斯平滑 模糊处理 减小光照 震动等原因产生的噪声影响
    28     gray_frame = cv2.GaussianBlur(gray_frame, (21, 21), 0)
    29 
    30     # 检测背景和帧的区别
    31     diff = cv2.absdiff(background, gray_frame)
    32     # 将区别转为二值
    33     diff = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)[1]
    34     # 定义结构元素
    35     es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 4))
    36     # 膨胀运算
    37     diff = cv2.dilate(diff, es, iterations=2)
    38     # 搜索轮廓
    39     image, cnts, hierarcchy = cv2.findContours(diff.copy(),
    40                          cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    41     """
    42     cv.findContours()
    43         参数:
    44             1 要寻找轮廓的图像 只能传入二值图像,不是灰度图像
    45             2 轮廓的检索模式,有四种:
    46                 cv2.RETR_EXTERNAL表示只检测外轮廓
    47                 cv2.RETR_LIST检测的轮廓不建立等级关系
    48                 cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,
    49                     里面的一层为内孔的边界信息。
    50                     如果内孔内还有一个连通物体,这个物体的边界也在顶层
    51                 cv2.RETR_TREE建立一个等级树结构的轮廓
    52             3 轮廓的近似办法
    53                 cv2.CHAIN_APPROX_NONE存储所有的轮廓点,
    54                     相邻的两个点的像素位置差不超过1,
    55                     即max(abs(x1-x2),abs(y2-y1))==1
    56                 cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,
    57                     只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
    58         返回值:
    59             contours:一个列表,每一项都是一个轮廓, 不会存储轮廓所有的点,只存储能描述轮廓的点
    60             hierarchy:一个ndarray, 元素数量和轮廓数量一样, 
    61                 每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],
    62                 分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数
    63     """
    64     for c in cnts:
    65         # 轮廓太小忽略 有可能是斑点噪声
    66         if cv2.contourArea(c) < 1500:
    67             continue
    68         # 将轮廓画出来
    69         (x, y, w, h) = cv2.boundingRect(c)
    70         cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
    71 
    72     cv2.imshow("contours", frame)
    73     cv2.imshow("diff", diff)
    74     if cv2.waitKey(5) & 0xff == ord("q"):
    75         break
    76 
    77 cv2.destroyAllWindows()
    78 camera.release()

     

     

     

  • 相关阅读:
    Gearman分布式任务处理系统(六)跨多种环境部署
    Gearman分布式任务处理系统(五)版本介绍、安装方法和使用说明
    Gearman分布式任务处理系统(四)Gearman协议
    Gearman分布式任务处理系统(三)libevent介绍
    Java课程笔记_4
    Lesson 13-14 How often do you exercise?
    Lesson 11-12 Men and Women
    Java课程笔记_3
    Lession 9-10 Cell Phone Taboos
    Lession 5-6 When you have a cold
  • 原文地址:https://www.cnblogs.com/Lin-Yi/p/9449707.html
Copyright © 2011-2022 走看看