Python-OpenCV 处理视频(五): 运动方向判断
在检测出运动的物体之后,我还需要知道运动的方向,使用了上一节中的办法检测运动我发现很难去计算运动方向,开始考虑通过计算轮廓的中点的变化来实现,但是因为每次检测出得轮廓的数量不稳定,所以这个办法会让误差不可控。
这时我发现了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 处理视频(五): 运动方向判断相关推荐
- 使用Python,OpenCV在视频中进行实时条形码检测
使用Python,OpenCV在视频中进行实时条形码检测 1. 步骤 2. 适用场景及优化 3. 总结 4. 源码 参考 上一篇博客介绍了如何检测和查找图像中的条形码.这篇博客将进行一些优化以检测实时 ...
- python图片转视频加特效_使用Python opencv实现视频与图片的相互转换
因为最近要经常转换数据集进行实验,因此记录一下. 1.视频转图片 即为将视频解析为一帧一帧的图片: import cv2 vc=cv2.VideoCapture("/home/hqd/Pyc ...
- 解决Python OpenCV 读取视频并抽帧出现error while decoding的问题
解决Python OpenCV 读取视频抽帧出现error while decoding的问题 1. 问题 2. 解决 3. 源代码 参考 1. 问题 读取H264视频,抽帧视频并保存,报错如下: [ ...
- python opencv 图片/视频 拼接
python opencv 图片/视频 拼接 # coding: utf-8 # 像写诗一样写代码 import numpy as np import cv2img_A_path = "C: ...
- python opencv写视频——cv2.VideoWriter()
python opencv写视频--cv2.VideoWriter() 函数原型 cv2.VideoWriter() VideoWriter(filename, fourcc, fps, frameS ...
- Python+OpenCV图像处理(五)——图像阈值和二值化
系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...
- python opencv PIL 视频分割成图片 图片合成为视频 修改图片大小(抗锯齿)
Python代码将原有的视频分割成图片,我的例子是一帧一帧的分割 用python+opencv完成视频的分割 import cv2 #导入opencv模块 print(2) #测试是否运行 vc=cv ...
- Python-OpenCV 处理视频(三)(四)(五): 标记运动轨迹 运动检测 运动方向判断
0x00. 光流 光流是进行视频中运动对象轨迹标记的一种很常用的方法,在OpenCV中实现光流也很容易. CalcOpticalFlowPyrLK 函数计算一个稀疏特征集的光流,使用金字塔中的迭代 L ...
- 利用Python+opencv进行视频文件的读取和保存,打开笔记本摄像头拍照保存、图像在窗口显示等操作
版权声明:本文为博主原创文章,转载请附源链接 一.视频文件的读取和保存 Opencv中视频的读入是用VideoCapture函数,保存用的是VideoWriter函数.这两个函数支持的视频格式因电脑系 ...
最新文章
- python for-python循环
- 组织可以最大限度提高数据中心性能的五个步骤
- 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16
- 【收藏】ArcGIS 10.8 for Desktop 完整安装教程(含win7/8/10 32/64位+下载地址+亲测可用+汉化)
- use putty to log on OS
- [vue] 你期待vue3.0有什么功能或者改进的地方?
- python附加索引_python – 附加两个多索引的pandas数据帧
- application/x-www-form-urlencoded
- python3解析库pyquery
- SQL已知现在的某一天求去年的同一天或去年同月份的第一天
- android封装全局调用的toast_安卓全局toast
- 树莓派Raspberry Pi 3 安装CentOS7,并扩展内存卡剩余空间---成功的经验
- 艾司博讯:拼多多拼单人数不够怎么取消
- transition失效
- 华为电脑linux怎么切换输入法,华为平板键盘怎么切换中文输入法
- 学而思总裁曹允东谈创业:融资意识很重要
- 美式口语发音技巧:《英美发音区别》
- 基于文心大模型的剧本杀海报生成器(武侠篇)
- aria2简单下载脚本
- 互联网摸鱼日报(2022-12-26)