摄像头的调用和视频识别

CV_tutorial3

  • 摄像头调用
    • +实时播放
    • +保存视频
  • 运动目标识别
    • 帧差法
    • 背景减除法

摄像头调用

创建视频捕捉对象:cv2.VideoCapture()
参数为视频设备的索引号,就一个摄像投的话写0默认;
或者是指定要读取视频的路径。

+实时播放

import cv2
import numpy as npcap = cv2.VideoCapture(0) 
# 创建循环结构连续按帧读取视频
while (True):# ret返回布尔值,frame三维矩阵(每一帧的图像)ret, frame = cap.read()# 并展示cv2.imread('frame', frame)# 按下‘q’键退出循环if cv2.waitKey(1) && 0xFF ==ord('q'):break
cap.release() # 释放资源
cv2.destroyAllWindows()

+保存视频

cv2.VideoWriter()

import cv2cap = cv2.VideoCapture(0)#创建编码方式
# mp4:'X','V','I','D'
# avi:'M','J','P','G'或'P','I','M','1' 
# flv:'F','L','V','1'
fourcc = cv2.VideoWriter_fourcc('X','V','I','D')# 创建VideoWriter对象
out = cv2.VideoWriter('ouput_1.mp4', fourcc, 20.0, (640, 480)) # 播放帧率,大小
# 创建循环结构进行连续读写
while(cap.isOpened()):ret, frame = cap.read()if ret == True:out.write(frame)cv2.imshow('frame', frame)if cv2.waitKey(1) && 0xFF == ord('q'):breakelse:break
cap.release()
out.release()
cv2.destryAllWindows()

运动目标识别

帧差法

通过对视频中相邻两帧图像做差分运算来标记运动物体,
移动的物体在相邻帧中灰度会有差别,因此差值为0的是静态物体。

import cv2
camera = cv2.VideoCapture("move_detect.flv")out_fps = 12.0 # 输出文件的帧率
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', '2') # 创建编码方式
# 创建VideoWriter对象
out1 = cv2.VideoWriter('v1.avi', fourcc, out_fps, (500, 400))
out2 = cv2.VideoWriter('v2.avi', fourcc, out_fps, (500, 400))# 初始化
lastFrame = None# 创建循环结构进行连续读写
while camera.isOpened():ret, frame = camera.read()# 如果不能抓取到一帧,说明到了视频的结尾if not ret:break# 调整该帧大小frame = cv2.resize(frame, (500, 400), interpolation = cv2.INTER_CUBIC)# 如果第一帧是None,对其初始化if lastFrame == None:lastFrame = framecontinue# 求帧差frameDelta = cv2.absdiff(lastFrame, frame)lastFrame = frame'''阈值化,留下轮廓'''thresh = cv2.cvtColor(frameDelta, cv2.COLOR_BGR2GRAY) # 灰度图thresh = cv2.threshold(thresh, 25, 255, cv2.THRESH_BINARY)[1] # 二值化# 阈值图像上的轮廓位置cnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 遍历轮廓for c in cnts:# 忽略小轮廓,可能运动的小鸟之类的,排除误差if cv2.contourArea(c) < 300:continue# 画轮廓边界框(x, y, w, h) = cv2.boundingRect(c)cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)# 展示当前帧cv2.imshow("frame", frame)cv2.imshow("frameDelta", frameDelta)cv2.imshow("thresh", thresh)# 保存视频out1.write(frame)out2.write(frameDelta)if cv2.waitKey(20) && 0xFF == ord('q'):break
# 资源释放
out1.release() 
out2.release() 
camera.release() 
cv2.destroyAllWindows()

在这里插入图片描述
飘动的彩带也被捕捉到了,但是去误差,没有标小轮廓;
行人前后帧(运动)幅度小的也没被发现(框定)。

背景减除法

对视频的背景进行建模,实现背景消除,生成mask图像,通过对mask二值图像分析实现对前景活动对象的区域的提取。

  1. 初始化背景建模对象GMM
  2. 读取视频一帧
  3. 使用背景建模消除生成mask
  4. 对mask进行轮廓分析图区ROI(region of interest)
  5. 绘制ROI对象
import numpy as np
import cv2# read the video
camera = cv2.VideoCapture('move_detect.flv')
# 创建背景减除对象
fgbg = cv2.createBackgroundSubstractorMOG2(history = 500, varThreshold = 100, detectShadows = False)def getPerson(image, opt=1):# 获取前景maskmask = fgbg.apply(frame)'''去噪'''# 创建一个矩形形状的结构元素,用于形态学操作,如腐蚀(erosion)和膨胀(dilation)line = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 5), (-1, -1))mask = cv2.morphologyEx(mask, cv2.MORPG_OPEN, line)cv2.imshow('mask', mask) # 画出轮廓并忽略小于阈值的轮廓contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for c in contours:area = cv2.contourArea(c)if area < 150:continuerect = cv2.minAreaRect(c) # 返回一个具有最小面积的矩形cv2.ellipse(image, rect, (0, 0, 255), 2, 8)cv2.circle(image, (np.int32(rect[0][0]), np.int32(rect[0][1])), 2, (0, 0, 255), 2, 8, 0) # 取矩形中心点作为圆心return image, maskwhile True:ret, frame = camera.read()res, m_ = getPerson(frame) # Python中使用下划线作为占位符变量名是一种惯例。它也可以用来忽略函数的返回值或迭代中的某些值,以避免产生未使用变量的警告cv2.imshow('res', res)if cv2.waitKey(20) && 0xFF == ord('q'):break
# 资源释放
camera.release() 
cv2.destroyAllWindows()

图像论1帧,连续帧就成了视频

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/88778.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP 地址追踪工具

IP 地址跟踪工具是一种网络实用程序&#xff0c;允许您扫描、跟踪和获取详细信息&#xff0c;例如 IP 地址的 MAC 和接口 ID。IP 跟踪解决方案通过使用不同的网络扫描协议来检查网络地址空间来收集这些详细信息。一些高级 IP 地址跟踪器软件&#xff08;如 OpUtils&#xff09;…

基于社交网络算法优化的BP神经网络(预测应用) - 附代码

基于社交网络算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于社交网络算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.社交网络优化BP神经网络2.1 BP神经网络参数设置2.2 社交网络算法应用 4.测试结果&#xff1a;5…

基于 OV5640 摄像头理论知识讲解-数字接口和控制接口

基于OV2640/ OV5640 的图像采集显示系统系列文章目录&#xff1a; &#xff08;1&#xff09;基于 OV5640 摄像头理论知识讲解-成像和采样原理 &#xff08;2&#xff09;基于 OV5640 摄像头理论知识讲解-数字接口和控制接口 &#xff08;3&#xff09;基于 OV5640 摄像头理论知…

视频汇聚/视频云存储/视频监控管理平台EasyCVR视频平台添加萤火云设备的具体操作步骤

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

1、[春秋云镜]CVE-2022-32991

文章目录 一、相关信息二、解题思路&#xff08;手注&#xff09;三、通关思路&#xff08;sqlmap&#xff09; 一、相关信息 靶场提示&#xff1a;该CMS的welcome.php中存在SQL注入攻击。 NVD关于漏洞的描述&#xff1a; 注入点不仅在eid处&#xff01;&#xff01;&#xff…

vscode vue3自定义自动补全

敲代码多了&#xff0c;发现重发动作很多&#xff0c;于是还是定义自动补全代码吧——懒是第一生产力&#xff01; 1&#xff0c;Ctrl Shift P打开快捷命令行&#xff1a;找到下面这个 2&#xff0c;然后找到ts&#xff1a; 里面给了demo照着写就行 // "Print to conso…

栈和队列(详解)

一、栈 1.1、栈的基本概念 1.1.1、栈的定义 栈&#xff08;Stack&#xff09;&#xff1a;是只允许在一端进行插入或删除的线性表。首先栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作。 栈顶&#xff08;Top&#xff09;&#xff1a;线性表允许…

MR混合现实石油化工课堂情景实训教学演示

MR&#xff08;混合现实&#xff09;技术是一种结合了虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;优势的新型技术&#xff0c;在教育领域具有广阔的应用前景。在石油化工课堂中&#xff0c;MR混合现实情景实训教学的应用可以大大提高学生的学习效…

为C# Console应用化个妆

说到Windows的cmd&#xff0c;刻板印象就是黑底白字的命令行界面。跟Linux花花绿绿的界面比&#xff0c;似乎单调了许多。但其实C#开发的Console应用也可以摆脱单调非黑即白的UI。 最近遇到个需求&#xff0c;要在一堆纯文本文件里找指定的关键字&#xff08;后续还要人肉判断…

【算法训练-哈希】两数之和、三数之和

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是两数之和和三数之和&#xff0c;使用哈希这个基本的数据结构来实现 两数之和【EASY】 照例先从简单往难搞 题干 输入&#xff1a; [3,2,4],6返…

【数学建模竞赛】各类题型及解题方案

评价类赛题建模流程及总结 建模步骤 建立评价指标->评价体系->同向化处理&#xff08;都越多越好或越少越少&#xff09;->指标无量纲处理 ->权重-> 主客观->合成 主客观评价问题的区别 主客观概念主要是在指标定权时来划分的。主观评价与客观评价的区别…

算法通过村第三关-数组白银笔记|数组双指针

文章目录 前言什么是数组双指针数组中删除元素专题原地移除所有等值val的元素快慢双指针对撞双指针对撞覆盖 删除有序数组中的重复项 总结 前言 提示&#xff1a;世间从不缺少辉煌的花冠&#xff0c;缺少的是被花冠渲染的淡定。 什么是数组双指针 这是一种长期总结下来的思想&…