OpenCV动态人物识别代码

news2024/12/23 1:51:58

动态人物识别代码


int main()
{
	// 打开视频文件或摄像头
	VideoCapture cap("vtest.avi");
	// VideoCapture cap(0);  // 使用默认摄像头

	if (!cap.isOpened())
	{
		std::cout << "无法打开视频文件或摄像头流" << std::endl;
		return -1;
	}

	// 读取第一帧
	Mat prevFrame,prevGray;
	cap >> prevFrame;

	prevGray = Mat(prevFrame.size(), CV_8UC1, Scalar(255));
	int kk = 0;
	while (true)
	{
		Mat nextFrame, nextGray;
		cap >> nextFrame;

		if (nextFrame.empty())
			break;

		// 将当前帧与背景帧进行差分
		Mat diff;
		absdiff(prevFrame, nextFrame, diff);

		// 将差分图像转换为灰度图像
		Mat gray;
		cvtColor(diff, gray, COLOR_BGR2GRAY);

		GaussianBlur(gray, gray, Size(9, 9), 2, 2);  //平滑滤波
		// 对灰度图像进行阈值处理
		threshold(gray, nextGray, 30, 255, THRESH_BINARY);
		
		//当前二值化图像  --  (上一张和当前图像的二值化图像) 与 (下一张和当前图像的二值化图像)
		Mat currentGray;
		bitwise_and(prevGray, nextGray, currentGray);

		// 对二值图像进行膨胀操作,以填充物体区域
		Mat dilated;
		Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
		dilate(currentGray, dilated, kernel, Point(-1, -1), 3);

		//生成随机颜色,用于区分不同连通域
		RNG rng(10086);
		Mat out, stats, centroids;
		//统计图像中连通域的个数
		int number = connectedComponentsWithStats(dilated, out, stats, centroids, 8, CV_16U);
		vector<Vec3b> colors;
		for (int i = 0; i < number; i++)
		{
			//使用均匀分布的随机数确定颜色
			Vec3b vec3 = Vec3b(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));
			colors.push_back(vec3);
		}

		//以不同颜色标记出不同的连通域
		Mat result = Mat::zeros(prevFrame.size(), CV_8UC3);
		int w = result.cols;
		int h = result.rows;
		for (int i = 1; i < number; i++)
		{
			// 中心位置
			int center_x = centroids.at<double>(i, 0);
			int center_y = centroids.at<double>(i, 1);
			//矩形边框
			int x = stats.at<int>(i, CC_STAT_LEFT);
			int y = stats.at<int>(i, CC_STAT_TOP);
			int w = stats.at<int>(i, CC_STAT_WIDTH);
			int h = stats.at<int>(i, CC_STAT_HEIGHT);
			int area = stats.at<int>(i, CC_STAT_AREA);
			if (area < 500)
			{
				continue;
			}
			// 外接矩形
			Rect rect(x, y, w, h);
			rectangle(prevFrame, rect, colors[i],2);

		}
		// 寻找轮廓
		//std::vector<std::vector<Point>> contours;
		//std::vector<Vec4i> hierarchy;
		//findContours(dilated, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

		// 绘制检测到的轮廓
		//for (size_t i = 0; i < contours.size(); i++)
		//{
		//	if (minAreaRect(contours[i]).boundingRect().area()< 500)  // 设置最小轮廓面积以过滤噪声
		//		continue;
		//	Rect boundingRect1 = boundingRect(contours[i]);
		//	rectangle(prevFrame, boundingRect1, Scalar(0, 255, 0), 2);
		//}
		// 显示结果帧
		imshow("Motion Detection", prevFrame);

		// 按下ESC键退出循环
		if (waitKey(1) == 27)
			break;

		//用作下一个循环做对比
		prevGray = nextGray;
		prevFrame = nextFrame;
	}

	// 释放资源并关闭窗口
	cap.release();
	destroyAllWindows();

	return 0;
}

在这里插入图片描述

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

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

相关文章

幽灵依赖是什么,pnpm出现的意义,使用pnpm创建一个vue3项目

什么是幽灵依赖&#xff08;幻影依赖&#xff09; 比如我们创建一个全新的vue3项目 然后我们正常地通过npm install来下载依赖 然后我们发现&#xff0c;node_ modules文件夹下的很多依赖&#xff0c;我们在package.json中明明没去声明却都下载下来了 那么这些没声明却下载…

SQL-游标-查询

/***DB版本&#xff1a;SQL Server 2022***/ --切换数据库 use MyDatabase--创建游标(scroll&#xff1a;滚动游标) declare mycur cursor scroll for select EmpNo from Employee--打开游标 open mycur --提取第一行 fetch first from mycur --提取最后一行 fetch last from m…

ansible自动化安装及简单操作

目录 一、运行机制 二、安装 1.下载ansible 2.配置免密 3.修改配置文件 4.创建主机清单 5.远程安装 6.远程卸载 一、运行机制 Ansible&#xff1a; ansible的核心模块 Host Inventory&#xff1a;主机清单&#xff0c;也就是被管理的主机列表 Playbooks&…

实战打靶集锦-021-glasgowsmile

提示&#xff1a;本文记录了博主的一次曲折的打靶经历。 目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 手工访问4.2 目录枚举4.3 手工探查4.4 搜索EXP4.5 joomlascan4.6 用户猜测与密码爆破4.7 构建反弹shell 5. 提权5.1 优化shell5.2 枚举系统信息5.3 探查/etc/pass…

虚拟机VMware+Ubuntu配置DPDK环境并运行Helloworld

虚拟机VMwareUbuntu配置DPDK环境并运行Helloworld 文章目录 虚拟机VMwareUbuntu配置DPDK环境并运行Helloworld安装虚拟机虚拟机中安装DPDK运行Helloworld 首先需要强调的是&#xff0c;版本的影响很大&#xff0c;有可能会因为版本不匹配而导致无法成功配置DPDK环境。 安装虚拟…

【Leetcode -637.二叉树的层平均值 -671.二叉树中第二小的节点】

Leetcode Leetcode -637.二叉树的层平均值Leetcode -671.二叉树中第二小的节点 Leetcode -637.二叉树的层平均值 题目&#xff1a;给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10^(- 5) 以内的答案可以被接受。 示例 1&#xff1…

TCP服务器的C#实现

1、TCP实现类 internal class TcpServer{public Socket ServerSocket { get; set; }public Dictionary<string,Socket> Sockets { get; set; } new Dictionary<string,Socket>();public byte[] SendBuffer { get; set; }public byte[] ReceiveBuffer { get; set; …

Qt消息对话框

一、头文件及类型 #include<QMessageBox> 二、错误、信息、提示、警告演示 错误对话框 QMessageBox::critical(this,"critical","错误"); 信息对话框 QMessageBox::information(this,"info","信息"); 提问对话框 if(QMessageBo…

发布自己的第一个抖音小程序

结构与微信小程序一样 内嵌H5网页&#xff0c;适用于任何平台&#xff0c;同样也是使用web-view组件 <web-view src"https://some-domain/some/path"></web-view> 相比起来&#xff0c;它比微信小程序更加简化&#xff0c;开发会更方便了。 API查询地…

超越Java 7,迎接Java 8时代!掌握这些新特性提升你的编程技能!

大家好&#xff0c;我是小米&#xff0c;一个热衷于技术分享的小伙伴。今天&#xff0c;我将向大家介绍Java 8中的一些新特性。Java 8作为一次重大更新&#xff0c;引入了许多令人激动的新功能&#xff0c;让我们的编码变得更加简洁高效。接下来&#xff0c;我们将详细介绍这些…

【暂时解决】radio单选框的change事件执行两次

项目场景&#xff1a; 简单的单选框场景 选择国内地区&#xff0c;省市县的下拉框就显示&#xff0c;选择国外地区就隐藏。 问题描述 当我使用radio的change事件时&#xff0c;会执行两次 javascript&#xff1a; $(input[typeradio][nameoptionsRadios]).change(function …

黑产科普丨揭秘游戏黑灰产业链

自今年起&#xff0c;游戏版号已恢复常态化发放&#xff0c;游戏行业在官方发文肯定、重获资本青睐、AI降本增效等多方助力下持续回暖。暑期档将至&#xff0c;游戏厂商为了抢占更多的市场份额&#xff0c;占据更多的玩家视野&#xff0c;将有大量的游戏选择在这个时间上线。 …

datax-Oracle新增writeMode支持

1.在com.alibaba.datax.plugin.writer.oraclewriter.OracleWriter中注释此内容,以让oracle支持writeMode模式 2.在com.alibaba.datax.plugin.rdbms.writer.util.WriterUtil中,增加对oracle的判断,将getWriteTemplate修改为如下内容 public static String getWriteTemplate(List…

在文件夹中获取某个文件的绝对路径

#!/bin/bash -lpathfind $(pwd) -name *.ipaecho ${path}写成下面这样也是可以的 path$(find $(pwd) -name *.ipa)如图所示&#xff0c;Export 文件夹下有.ipa文件&#xff0c;我们目前想获取.ipa文件的绝对路径 执行结果如下 192:Jenkins liubo$ cd /Users/liubo/Desktop/…

C# 通过委托实现多个窗口之间的传值

之前用qt写的时候&#xff0c;都有信号和槽来实现&#xff0c;用C#的话应该也有类似的 大概实现的是我在父窗口当中new了两个子窗口&#xff0c;这个两个子窗口都可以将处理完的数据传递给父窗口&#xff0c;并且两个子窗口通过父窗口进行通信。 我这就按上面窗口名称来说明代…

pipeline实现二次还原

通过mode参数确定是否发布还是回滚&#xff0c;在满足rollback条件下&#xff0c;列举出我们的所有的备份的目录&#xff0c;根据回滚条件选择索要回滚的目录(目录是根据时间戳来判断创建的文件) pipeline {agent anyparameters {choice(name: mode, choices: [deploy,rollbac…

HA 自动化-通知提醒

配置->场景自动化->创建自动化 notify.notify

Gitlab群组及项目仓库搭建

1、新建群组 2、新建项目 3、克隆到Visualstudio 复制克隆地址&#xff0c;克隆到本地 这里会让你登录账号 可以添加成员并邀请ta进项目组 从已注册用户列表中选择 4、Git工作流 回顾一下Git工作流&#xff0c;工程人员只需要从Develop分支新建自己的分支即可。分支命名以姓名…

设计模式学习之抽象工厂模式

设计模式系列往期文章 设计模式学习之策略模式设计模式学习之策略模式在前端的应用设计模式学习之简单工厂模式设计模式学习之工厂方法模式 如果你已经理解了工厂方法模式&#xff0c;那你能够很快的明白抽象工厂模式。 温习&#xff1a;什么是工厂方法模式 我们先温习一下…

【面试题19】B-Tree和B+Tree的区别,以及B+Tree在MySQL中的应用

文章目录 一、前言二、关于B-Tree和B Tree2.1 B-Tree2.2 BTree 三、B Tree与B Tree的差异3.1 叶子节点的差异3.2 数据访问的差异3.3 范围查询的差异 四、Mysql中BTree的应用场景4.1 主键索引4.2 唯一索引4.3 普通索引 五、MySQL为什么使用BTree来做索引&#xff1f;总结 一、前…