在检测出运动的物体之后,我还需要知道运动的方向,使用了上一节中的办法检测运动我发现很难去计算运动方向,开始考虑通过计算轮廓的中点的变化来实现,但是因为每次检测出得轮廓的数量不稳定,所以这个办法会让误差不可控。

这时我发现了goodFeaturesToTrack函数,简直是救了我,goodFeaturesToTrack函数可以获取图像中的最大特征值的角点,以下是我的思路:

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

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

  • 使用goodFeaturesToTrack函数得到最大特征值的角点。

  • 计算角点的平均点,扔进队列。

  • 维护一个长度为10的队列,队列满时计算队列中数据的增减情况,来确定运动方向。

以下是代码示例:

#!usr/bin/env python
#coding=utf-8import cv2
import numpy as np
import Queuecamera = cv2.VideoCapture(0)
width = int(camera.get(3))
height = int(camera.get(4))firstFrame = None
lastDec = None
firstThresh = Nonefeature_params = dict( maxCorners = 100,qualityLevel = 0.3,minDistance = 7,blockSize = 7 )# Parameters for lucas kanade optical flow
lk_params = dict( winSize  = (15,15),maxLevel = 2,criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))color = np.random.randint(0,255,(100,3))
num = 0q_x = Queue.Queue(maxsize = 10)
q_y = Queue.Queue(maxsize = 10)while 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)p0 = cv2.goodFeaturesToTrack(thresh, mask = None, **feature_params)if p0 is not None:x_sum = 0y_sum = 0for i, old in enumerate(p0):x, y = old.ravel()x_sum += xy_sum += yx_avg = x_sum / len(p0)y_avg = y_sum / len(p0)if q_x.full():# print list(q_x.queue)qx_list = list(q_x.queue)key = 0diffx_sum = 0for item_x in qx_list:key +=1if key < 10:diff_x = item_x - qx_list[key]diffx_sum += diff_x# print diff_xif diffx_sum < 0 and x_avg < 500:# print "some coming form left"cv2.putText(frame, "some coming form left", (100,100), 0, 0.5, (0,0,255),2)else:print "right"print x_avgq_x.get()q_x.put(x_avg)cv2.putText(frame, str(x_avg), (300,100), 0, 0.5, (0,0,255),2)frame = cv2.circle(frame,(int(x_avg),int(y_avg)),5,color[i].tolist(),-1)cv2.imshow("Security Feed", frame)firstFrame = gray.copy()camera.release()
cv2.destroyAllWindows()

总的来讲作为一个图像处理的小白,不断地折腾和尝试,终于搞出了自己想要的东西,OpenCV绝对是喜欢折腾的人必要掌握的一个库了,以后肯定还会继续研究这块东西。

Python-OpenCV 处理视频(五): 运动方向判断相关推荐

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

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

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

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

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

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

  4. python opencv 图片/视频 拼接

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

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

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

  6. Python+OpenCV图像处理(五)——图像阈值和二值化

    系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...

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

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

  8. Python-OpenCV 处理视频(三)(四)(五): 标记运动轨迹 运动检测 运动方向判断

    0x00. 光流 光流是进行视频中运动对象轨迹标记的一种很常用的方法,在OpenCV中实现光流也很容易. CalcOpticalFlowPyrLK 函数计算一个稀疏特征集的光流,使用金字塔中的迭代 L ...

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

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

最新文章

  1. python for-python循环
  2. 组织可以最大限度提高数据中心性能的五个步骤
  3. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16
  4. 【收藏】ArcGIS 10.8 for Desktop 完整安装教程(含win7/8/10 32/64位+下载地址+亲测可用+汉化)
  5. use putty to log on OS
  6. [vue] 你期待vue3.0有什么功能或者改进的地方?
  7. python附加索引_python – 附加两个多索引的pandas数据帧
  8. application/x-www-form-urlencoded
  9. python3解析库pyquery
  10. SQL已知现在的某一天求去年的同一天或去年同月份的第一天
  11. android封装全局调用的toast_安卓全局toast
  12. 树莓派Raspberry Pi 3 安装CentOS7,并扩展内存卡剩余空间---成功的经验
  13. 艾司博讯:拼多多拼单人数不够怎么取消
  14. transition失效
  15. 华为电脑linux怎么切换输入法,华为平板键盘怎么切换中文输入法
  16. 学而思总裁曹允东谈创业:融资意识很重要
  17. 美式口语发音技巧:《英美发音区别》
  18. 基于文心大模型的剧本杀海报生成器(武侠篇)
  19. aria2简单下载脚本
  20. 互联网摸鱼日报(2022-12-26)

热门文章

  1. 大牛带你深入SpringBoot:自定义Endpoint 及实现原理
  2. eBay的Elasticsearch性能调优实践
  3. 亿级短视频社交美拍架构实践
  4. 七牛大数据平台的演进与大数据分析实践--转
  5. tomcat 容器生命周期lifecycle
  6. 机器学习Sklearn实战——其他线性回归模型、逻辑回归
  7. 评价并不精辟,感觉没有什么深度
  8. jvm性能调优实战 - 24模拟因动态年龄判断对象进入老年代的场景
  9. Redis-01Redis概述
  10. java round指令_Java PApplet.round方法代码示例