OpenCV检测场景内是否有移动物体
2017-11-20 23:26
471 查看
我喜欢听着音乐上大号,我就想有没有办法在我上大号时自动播放音乐,智能马桶的滚粗(能放音乐的应该不多)。这时,我想起了闲置的树莓派,使用OpenCV+树莓派做Motion Detection,只要检测到有移动的东西(人)就开始播放音乐。恩,没错,本人相当懒。另外,在上大号时被摄像头照着也挺别扭。
Motion Detection的实现方法有很多,我使用的方法是Background
subtraction、tutorial_py_bg_subtraction。
Background subtraction基本原理:首先取一张静态的背景图(不包含要检测的移动物体),然后比较监控图像(包含移动物体)和背景图,找到不同区域,这个区域就是要检测的物体。在现实环境中要复杂的多,我们还要考虑到光线变化、阴影、反射等等影响背景环境的因素。
本帖代码运行环境:Ubuntu + OpenCV 3.1,稍作修改即可在树莓派上运行。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 | import cv2import time camera = cv2.VideoCapture(0)if camera is None: print('请先连接摄像头') exit() fps = 5 # 帧率pre_frame = None # 总是取前一帧做为背景(不用考虑环境影响) play_music = False while True: start = time.time() res, cur_frame = camera.read() if res != True: break end = time.time() seconds = end - start if seconds < 1.0/fps: time.sleep(1.0/fps - seconds) """ cv2.imshow('img', cur_frame) key = cv2.waitKey(30) & 0xff if key == 27: break """ gray_img = cv2.cvtColor(cur_frame, cv2.COLOR_BGR2GRAY) gray_img = cv2.resize(gray_img, (500, 500)) gray_img = cv2.GaussianBlur(gray_img, (21, 21), 0) if pre_frame is None: pre_frame = gray_img else: img_delta = cv2.absdiff(pre_frame, gray_img) thresh = cv2.threshold(img_delta, 25, 255, cv2.THRESH_BINARY)[1] thresh = cv2.dilate(thresh, None, iterations=2) image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in contours: if cv2.contourArea(c) < 1000: # 设置敏感度 continue else: #print(cv2.contourArea(c)) print("前一帧和当前帧不一样了, 有什么东西在动!") play_music = True break pre_frame = gray_img camera.release()cv2.destroyAllWindows() |
我在摄像头前稍有移动,它就检测出来了。如果我在摄像头前保持静止,由于前一帧和当前帧没有大的变化,它就认为场景内没有移动的东西。下面只要起一个线程播放音乐就大公告成了。Python播放mp3的方法非常多,由于我使用Linux系统,最简单的方式是直接调用mplayer,连线程都省了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | importos importsubprocess importrandom importcv2 importtime camera=cv2.VideoCapture(0) ifcameraisNone: print('请先连接摄像头') exit() fps=5# 帧率 pre_frame=None # 总是取前一帧做为背景 mp3_path='/root/Music' mp3_filenames=[] formp3inos.listdir(mp3_path): ifmp3.endswith('.mp3'): mp3_filenames.append(mp3) whileTrue: start=time.time() res,cur_frame=camera.read() ifres!=True: break end=time.time() seconds=end-start ifseconds<1.0/fps: time.sleep(1.0/fps-seconds) """ cv2.imshow('img', cur_frame) key = cv2.waitKey(30) & 0xff if key == 27: break """ gray_img=cv2.cvtColor(cur_frame,cv2.COLOR_BGR2GRAY) gray_img=cv2.resize(gray_img,(500,500)) gray_img=cv2.GaussianBlur(gray_img,(21,21),0) ifpre_frameisNone: pre_frame=gray_img else: img_delta=cv2.absdiff(pre_frame,gray_img) thresh=cv2.threshold(img_delta,25,255,cv2.THRESH_BINARY)[1] thresh=cv2.dilate(thresh,None,iterations=2) image,contours,hierarchy=cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) forcincontours: ifcv2.contourArea(c)<1000:# 设置敏感度 continue else: mp3_file=mp3_path+'/'+random.choice(mp3_filenames) print("playing",mp3_file) p=subprocess.Popen('mplayer '+mp3_file,stdin=None,stdout=None,shell=True) p.wait() break pre_frame=gray_img camera.release() cv2.destroyAllWindows() |
1 2 3 4 5 6 7 8 | camera = PiCamera() camera.resolution = (500, 500) camera.framerate = 5 rawCapture = PiRGBArray(camera) for f in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): cur_frame = f.array #... |
https://github.com/RobinDavid/Motion-detection-OpenCV
https://github.com/cedricve/motion-detection
motion-Linux下的运动检测工具
转载自:http://blog.topspeedsnail.com/archives/10797
相关文章推荐
- 【Python+OpenCV】实现检测场景内是否有物体移动,并进行人脸检测抓拍
- 利用opencv进行移动物体检测
- opencv(九)--移动物体检测
- 基于python使用opencv监测视频指定区域是否有物体移动
- python opencv 检测移动物体并截图保存
- 使用OpenCV实现简单的移动物体检测和追踪
- php检测是否移动设备浏览器
- opencv 检测运动物体 例子时出现图像反转
- raspberry pi 打造移动物体检测,并上传至ftp
- opencv+python检测入侵物体
- 3D场景中的物体跟随鼠标移动
- 双线程检测绿色和红色物体(opencv)
- 【unity3d】2D场景下的物体移动
- 【树莓派编程】检测有没有物体移动 +人脸识别
- 【OpenCV_11】利用OpenCV检测鼠标点击及移动 Detect Mouse Clicks and Moves
- OpenCV轮廓检测,计算物体旋转角度
- OpenCV之feature2d 模块. 2D特征框架(2)特征描述 使用FLANN进行特征点匹配 使用二维特征点(Features2D)和单映射(Homography)寻找已知物体 平面物体检测
- opencv之矩形物体检测
- unity 检测物体是否在相机视野范围内
- OpenCV之objdetect 模块. 物体检测:级联分类器