摄像头的调用和视频识别

news2024/12/29 9:40:34

CV_tutorial3

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

摄像头调用

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

+实时播放

import cv2
import numpy as np

cap = 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 cv2

cap = 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'):
			break
		else:
			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 = frame
		continue
	# 求帧差
	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):
	# 获取前景mask
	mask = 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:
			continue
		rect = 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, mask

while 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.coloradmin.cn/o/946292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法】经典的八大排序算法

点击链接 可视化排序 动态演示各个排序算法来加深理解&#xff0c;大致如下 一&#xff0c;冒泡排序&#xff08;Bubble Sort&#xff09; 原理 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它通过多次比较和交换相邻元素的方式&#xff0c;将…

实战 图书馆系统管理案例

config &#xff1a;敏感的配置一般都是在配置中心配置&#xff0c;比如consul或者阿波罗上面controller &#xff1a;写一些handler的&#xff0c;拿到参数要去调用service层的逻辑。&#xff08;只负责接受参数&#xff0c;怎么绑定参数&#xff0c;要去调用哪个service的&am…

QT6修改程序图标和名字以及打包部署

首先确定已经编译成功无错误 修改窗口的名字 修改图标 当有pro工程文件时&#xff0c; 只需要将ico文件放在工程文件的同级文件夹中&#xff0c;然后在pro文件中加入RC_ICONSico文件的名字 当使用cmake建立工程时 参考&#xff1a;https://blog.csdn.net/chqaz123/article…

PowerBuilder调用外部VB6 ActiveX EXE公共对象

学习的同时习练PowerBuilder对VB6 ActiveX exe公共对象的调用&#xff0c;初步感觉PowerBuilder调用DLL还是要求比较严格的&#xff0c;APP和powerbuilder本身都比较脆弱、易崩溃&#xff0c;因此&#xff0c; 1. 直接调用外部DLL时&#xff0c;传递地址参数&#xff0c;尽量不…

音频接口电路的PCB设计注意事项

Audio接口是音频插孔&#xff0c;即音频接口&#xff0c;可分为Audio in接口和Audio out接口。音频接口是连接麦克风和其他声源与计算机的设备&#xff0c;其在模拟和数字信号之间起到了桥梁连接的作用。 其余走线要求如下&#xff1a; 1、所有CLK信号建议串接22ohm电阻&#…

【零基础算法】Vector动态数组

为什么开始先更新数据结构&#xff1f;博主其实一开始也不怎么喜欢调这些数据&#xff0c;觉得用C语言造轮子才是最好的。后面学习过程中学习的算法逐渐复杂&#xff0c;实际上会发现&#xff0c;了解和调用一些已经写好的库工具是很方便的一件事&#xff0c;我们需要做的是知道…

计算机竞赛 基于机器视觉的手势检测和识别算法

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的手势检测与识别算法 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng…

伺服电机驱动器EMC处理方案

伺服驱动器内部也有低压单元&#xff0c; 很可能受到驱动器外围设备的噪音干扰&#xff0c;受到干扰的信号可能会引起设备做出意想不到的动作 为防止伺服驱动器和其外围设备之间的相互电磁干扰&#xff0c; 可根据采取以下的对策&#xff1a; ● 请务必使驱动器及电机良好的接…

USB与蓝牙通信原理图设计

蓝牙模块设计&#xff1a; USB2.0 ----ESD保护芯片---- USB转串口芯片&#xff08;CP2104-F03-GMR&#xff09;--------- PTR5618蓝牙模块 ---------- PTR5618的GPIO0\GPIO1作为IIC与EEPROM芯片通信 &#xff08;AT24CS04-STUM-T&#xff09; 磁珠的作用是一直EMI干扰。 一…

《Go 语言第一课》课程学习笔记(十二)

函数 Go 函数与函数声明 在 Go 语言中&#xff0c;函数是唯一一种基于特定输入&#xff0c;实现特定任务并可返回任务执行结果的代码块&#xff08;Go 语言中的方法本质上也是函数&#xff09;。在 Go 中&#xff0c;我们定义一个函数的最常用方式就是使用函数声明。 第一部…

虚拟直播从0到1全套解决方案,码住这个神器,小白也能轻松涨粉过万!

直播行业历经十余年生长&#xff0c;用户规模持续上升&#xff0c;成为平台经济领域的中流砥柱。同时&#xff0c;元宇宙的兴起也推动了虚拟现实等先进技术在直播行业的应用&#xff0c;越来越多的老板开始尝试使用虚拟直播完成各类形式的直播活动&#xff0c;与传统型的直播间…

Web核心基础总结

尚硅谷课程&#xff1a;293-尚硅谷-Filter-什么是Filter过滤器_哔哩哔哩_bilibili JavaWeb核心技术点&#xff1a; Servlet程序、Filter过滤器、Listener监听器、jsp页面、EL表达式、JSTL标签库、jQuery框架、Cookie技术、Session会话、JSON使用、Ajax请求&#xff0c; 第一…

独立服务编排逻辑引擎:jvs-logic服务原子组件介绍

逻辑引擎的本质是可视化的服务编排是指使用图形化工具、配置和管理原子服务间的工作步骤和调用关系。这种方法可以快速的实现业务功能&#xff0c;使非开发人员也能轻松地创建和管理服务的工作流程。 可视化服务编排工具提供了直观的界面和丰富的功能&#xff0c;以及便捷的执行…

【 ARMv9 Cluster BUS QoS 配置】

文章目录 ARM Cluster QoS ARM Cluster QoS QoS&#xff08;Quality of Service&#xff0c;服务质量&#xff09;在 ARM 架构中&#xff0c;主要指的是一种机制&#xff0c;它可以控制和管理系统资源&#xff08;如内存、总线带宽等&#xff09;的使用&#xff0c;以满足各种…

关于#include<bits/stdc++.h>的说明

关于#include<bits/stdc.h>的说明 在看C/C竞赛题时&#xff0c;经常看到#include<bits/stdc.h>。什么意思呢&#xff1f; 有人称<bits/stdc.h>为万能头文件。其 优点&#xff1a;   1、在竞赛中节约时间。   2、减少了编写所有必要头文件的工作量。  …

SSM - Springboot - MyBatis-Plus 全栈体系(二)

第一章 Maven 三、Maven 核心功能依赖和构建管理 1. 依赖管理和配置 Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题&#xff0c;使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程…

安全帽人脸联动闸机开关算法

安全帽人脸联动闸机开关算法通过yolov7python网络模型深度学校框架 &#xff0c;安全帽人脸联动闸机开关算法能够判断人员是否穿戴规定的工装是不是现场人员&#xff0c;当穿戴合规且为现场人员&#xff0c;闸机门禁才打开。YOLO的结构非常简单&#xff0c;就是单纯的卷积、池化…

PostgreSQL中字符串与ASCII码互转

PostgreSQL中字符串与ASCII码互转 一、字符串转ASCII码&#xff1a;ascii ( text ) → integer二、ASCII码转字符串&#xff1a;chr ( integer ) → text 一、字符串转ASCII码&#xff1a;ascii ( text ) → integer 返回参数的第一个字符的数字代码。在UTF8编码中&#xff0c…

I IntelliJ IDEA 2023.2 最新解锁方式,支持java20

在 IntelliJ IDEA 2023.1 中&#xff0c;我们根据用户的宝贵反馈对新 UI 做出了大量改进。 我们还实现了性能增强&#xff0c;从而更快导入 Maven&#xff0c;以及在打开项目时更早提供 IDE 功能。 新版本通过后台提交检查提供了简化的提交流程。 IntelliJ IDEA Ultimate 现在支…

解决Docker镜像国内无法下载问题

近期由于docker镜像仓库禁止国内下载&#xff0c;国内各平台均无法下载更新最新docker镜像。为解决此问题&#xff0c;大家可以使用dockerproxy代理下载。 使用方法&#xff1a; 大家只需打开docker proxy代理网站&#xff0c;在快捷命令中输入所需镜像和版本&#xff0c;点击…