0x00. 平均值法

通过计算两帧图像之间变化了的像素点占的百分比,来确定图像中是否有动作产生。

这里主要用到 Absdiff 函数,比较两帧图像之间有差异的点,当然需要将图像进行一些处理,例如平滑处理,灰度化处理,二值化处理,经过处理之后的二值图像上的点将更有效。

代码示例:

import cv2.cv as cvcapture=cv.CaptureFromCAM(0)frame1 = cv.QueryFrame(capture)
frame1gray = cv.CreateMat(frame1.height, frame1.width, cv.CV_8U)
cv.CvtColor(frame1, frame1gray, cv.CV_RGB2GRAY)res = cv.CreateMat(frame1.height, frame1.width, cv.CV_8U)frame2gray = cv.CreateMat(frame1.height, frame1.width, cv.CV_8U)w= frame2gray.width
h= frame2gray.height
nb_pixels = frame2gray.width * frame2gray.heightwhile True:frame2 = cv.QueryFrame(capture)cv.CvtColor(frame2, frame2gray, cv.CV_RGB2GRAY)cv.AbsDiff(frame1gray, frame2gray, res)cv.ShowImage("After AbsDiff", res)cv.Smooth(res, res, cv.CV_BLUR, 5,5)element = cv.CreateStructuringElementEx(5*2+1, 5*2+1, 5, 5,  cv.CV_SHAPE_RECT)cv.MorphologyEx(res, res, None, None, cv.CV_MOP_OPEN)cv.MorphologyEx(res, res, None, None, cv.CV_MOP_CLOSE)cv.Threshold(res, res, 10, 255, cv.CV_THRESH_BINARY_INV)cv.ShowImage("Image", frame2)cv.ShowImage("Res", res)#-----------nb=0for y in range(h):for x in range(w):if res[y,x] == 0.0:nb += 1avg = (nb*100.0)/nb_pixels#print "Average: ",avg, "%\r",if avg >= 5:print "Something is moving !"#-----------cv.Copy(frame2gray, frame1gray)c=cv.WaitKey(1)if c==27: #Break if user enters 'Esc'.break

0x01. 背景建模与前景检测

背景建模也是检测运动物体的一种办法,下面是代码示例:

import cv2.cv as cvcapture = cv.CaptureFromCAM(0)
width = int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH))
height = int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT))gray = cv.CreateImage((width,height), cv.IPL_DEPTH_8U, 1)background = cv.CreateMat(height, width, cv.CV_32F)
backImage = cv.CreateImage((width,height), cv.IPL_DEPTH_8U, 1)
foreground = cv.CreateImage((width,height), cv.IPL_DEPTH_8U, 1)
output = cv.CreateImage((width,height), 8, 1)begin = True
threshold = 10while True:frame = cv.QueryFrame( capture )cv.CvtColor(frame, gray, cv.CV_BGR2GRAY)if begin:cv.Convert(gray, background) #Convert gray into background formatbegin = Falsecv.Convert(background, backImage) #convert existing background to backImagecv.AbsDiff(backImage, gray, foreground) #Absdiff to get differencescv.Threshold(foreground, output, threshold, 255, cv.CV_THRESH_BINARY_INV)cv.Acc(foreground, background,output) #Accumulate to backgroundcv.ShowImage("Output", output)cv.ShowImage("Gray", gray)c=cv.WaitKey(1)if c==27: #Break if user enters 'Esc'.break

0x02. 我的方法

上面的几种办法我都试了下,基本上能识别出运动的物体,但是发现总是有点瑕疵,所以又比对了几种别人的方案,然后合成了一个自己的方案:

具体处理思路:

  • 对两帧图像做一个absdiff得到新图像。

  • 对新图像做灰度和二值化处理。

  • 使用findContours函数获取二值化处理之后的图片中的轮廓。

  • 使用contourArea()过滤掉自己不想要的面积范围的轮廓。

这个办法基本上能够检测出物体的图像中物体的移动,而且我觉得通过设定contourArea()函数的过滤范围,可以检测距离摄像头不同距离范围的运动物体。

以下是代码示例:

#!usr/bin/env python
#coding=utf-8import cv2
import numpy as npcamera = cv2.VideoCapture(0)
width = int(camera.get(3))
height = int(camera.get(4))firstFrame = Nonewhile True:(grabbed, frame) = camera.read()gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)gray = cv2.GaussianBlur(gray, (21, 21), 0)if firstFrame is None:firstFrame = graycontinueframeDelta = cv2.absdiff(firstFrame, gray)thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1]# thresh = cv2.adaptiveThreshold(frameDelta,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\# cv2.THRESH_BINARY,11,2)# thresh = cv2.adaptiveThreshold(frameDelta,255,cv2.ADAPTIVE_THRESH_MEAN_C,\#           cv2.THRESH_BINARY,11,2)thresh = cv2.dilate(thresh, None, iterations=2)(_, cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)for c in cnts:if cv2.contourArea(c) < 10000:continue(x, y, w, h) = cv2.boundingRect(c)cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.imshow("Security Feed", frame)firstFrame = gray.copy()
camera.release()
cv2.destroyAllWindows()

Python-OpenCV 处理视频(四): 运动检测相关推荐

  1. python opencv 图片/视频 拼接

    python opencv 图片/视频 拼接 # coding: utf-8 # 像写诗一样写代码 import numpy as np import cv2img_A_path = "C: ...

  2. 解决Python OpenCV 读取视频并抽帧出现error while decoding的问题

    解决Python OpenCV 读取视频抽帧出现error while decoding的问题 1. 问题 2. 解决 3. 源代码 参考 1. 问题 读取H264视频,抽帧视频并保存,报错如下: [ ...

  3. 使用Python,OpenCV在视频中进行实时条形码检测

    使用Python,OpenCV在视频中进行实时条形码检测 1. 步骤 2. 适用场景及优化 3. 总结 4. 源码 参考 上一篇博客介绍了如何检测和查找图像中的条形码.这篇博客将进行一些优化以检测实时 ...

  4. python图片转视频加特效_使用Python opencv实现视频与图片的相互转换

    因为最近要经常转换数据集进行实验,因此记录一下. 1.视频转图片 即为将视频解析为一帧一帧的图片: import cv2 vc=cv2.VideoCapture("/home/hqd/Pyc ...

  5. python opencv写视频——cv2.VideoWriter()

    python opencv写视频--cv2.VideoWriter() 函数原型 cv2.VideoWriter() VideoWriter(filename, fourcc, fps, frameS ...

  6. python opencv PIL 视频分割成图片 图片合成为视频 修改图片大小(抗锯齿)

    Python代码将原有的视频分割成图片,我的例子是一帧一帧的分割 用python+opencv完成视频的分割 import cv2 #导入opencv模块 print(2) #测试是否运行 vc=cv ...

  7. python opencv 录制视频_如何使用OpenCV、Python和深度学习在图像和视频中实现面部识别?...

    Face ID 的兴起带动了一波面部识别技术热潮.本文将介绍如何使用 OpenCV.Python 和深度学习在图像和视频中实现面部识别,以基于深度识别的面部嵌入,实时执行且达到高准确度. 以下内容由 ...

  8. 利用Python+opencv进行视频文件的读取和保存,打开笔记本摄像头拍照保存、图像在窗口显示等操作

    版权声明:本文为博主原创文章,转载请附源链接 一.视频文件的读取和保存 Opencv中视频的读入是用VideoCapture函数,保存用的是VideoWriter函数.这两个函数支持的视频格式因电脑系 ...

  9. python opencv读取视频没声音_python + opencv: 解决不能读取视频的问题

    博主一开始使用python2.7和Opencv2.4.10来获取摄像头图像,程序如下: cap = cv2.VideoCapture(0) ret, frame = cap.read() 使用这个程序 ...

  10. python+opencv横向拼接视频

    如果想利用python+opencv把两段视频拼接在一起,可以有两种想法: 1. 第二个视频直接接在第一个视频后边,延长帧.这种我称为"纵向拼接": 2. 第一个视频和第二个视频每 ...

最新文章

  1. “那个工作 10 年没跳槽的人,混不下去了”
  2. 80个招聘求职网站整理,不管招聘or求职,看这个就够了!
  3. 【HDU 2814 扩展欧拉 a^b ≡ (a mod c)^b mod ϕ(c)+ϕ(c) modc,b=ϕ(c) 】
  4. 图像处理学习--前篇--像素相关
  5. Ubuntu samba 安装与配置 实现windows和虚拟机中的Ubuntu共享文件
  6. json接口测试工具json-server
  7. 【Java面试题】线程的生命周期包括哪几个阶段?
  8. w ndows10图标,Win10桌面图标没了怎么办?Win10桌面快捷方式消失了解决方法
  9. css子元素选择父元素的实现
  10. 人类其实很脆弱,一个小小的条件变化,就能导致人没法享受元宇宙
  11. STOP:0x0000007E蓝屏软件故障处理
  12. 晨光文具商城多个商品里图片快速复制保存
  13. Unity技术手册 - 形状(Shape)子模块 - Sphere球体和 Hemisphere半球和Donut圆环圈
  14. SQL每日一题(20210901)如果员工的【入职日期】是当月15号后,则该员工的【社保缴纳月份】为【入职日期】的次月
  15. python测试request代理IP是否替换
  16. NEERC 2014 D题 Damage Assessment
  17. 历年茅台计算机招聘考试真题,2020贵州茅台招聘考试试题及答案(7)
  18. 达人评测 i3 12100和i5 12400选哪个
  19. 微信分享公众账号设置及服务器端代码
  20. 知识点 - 多项式插值法

热门文章

  1. 区块链在天猫国际商品溯源中的应用
  2. Kafka设计解析(四):Kafka Consumer解析--转
  3. Linux CentOS PhpMyAdmin安装--转载
  4. no awt in java.libary.path
  5. 同班同学20年后 身家15亿与月薪5000元的区别
  6. 每日一博 - 常见的Spring事务失效事务不回滚案例集锦
  7. Java8 - 自定义实现体会Future的原理
  8. 白话Elasticsearch36-深入聚合数据分析之案例实战Histogram Aggregation:按价格区间统计电视销量和销售额
  9. 电脑快捷键横屏变竖屏,电脑显示器竖屏横屏来回切换怎么设置
  10. python mvc web_浅谈python_web的MVC和MTV