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()

 

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM