OpenCV基于背景减除如何实现行人计数
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,OpenCV基于背景减除如何实现行人计数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言下面将使用OpenCV C++ 对视频中的
千家信息网最后更新 2025年02月23日OpenCV基于背景减除如何实现行人计数
OpenCV基于背景减除如何实现行人计数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
前言
下面将使用OpenCV C++ 对视频中的人流量进行统计。
一、图像预处理
原图如图所示。本案例的需求是想要统计画面中的人流量。画面中走动的行人可以看作是前景,那么我们就需要将前景、背景分割出来。我们可以使用OpenCV提供的BackgroundSubtractorMOG2 高斯混合模型,将行人从画面中分割出来,然后提取轮廓就可以统计人流量了。
PtrMOG = createBackgroundSubtractorMOG2();MOG->apply(frame, mask);
使用上面两行代码就可以创建高斯混合背景提取器。传入原图,返回背景减除结果。如上图所示。接下来只需对上图进行一些简单操作,再提取轮廓就可以进行人流统计了。
threshold(mask, mask, 200, 255, THRESH_BINARY );morphologyEx(mask, mask, MORPH_OPEN, kernel);dilate(mask, mask, kernel1);
进行二值化、形态学等操作可以将行人作为一个独立个体分割出来。效果如图。
二、对象计数
1.轮廓提取
将上面的二值图像进行轮廓检测,然后统计有效轮廓就可以完成对象计数了。
vector>contours; vector >EffectiveContours; findContours(mask, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); for (int i = 0; i < contours.size(); i++) { double area = contourArea(contours[i]); if (area > 300) { EffectiveContours.push_back(contours[i]); } }
2.效果显示
char text[10]; for (int i = 0; i < EffectiveContours.size(); i++) { RotatedRect rect = minAreaRect(EffectiveContours[i]); Rect box = rect.boundingRect(); rectangle(frame, Rect(box.x, box.y, box.width, box.height), Scalar(0, 255, 0), 2); sprintf_s(text, "%s%d", "Current:", EffectiveContours.size()); putText(frame, text, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 255, 0), 2); }
最终效果如图所示。
三、源码
#include#include using namespace std;using namespace cv;int main(){ VideoCapture capture; capture.open("1.avi"); if (!capture.isOpened()) { cout << "Can not open video source!" << endl; system("pause"); return -1; } Ptr MOG = createBackgroundSubtractorMOG2(); Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 5)); Mat kernel1 = getStructuringElement(MORPH_RECT, Size(7, 3)); Mat frame, mask; while (capture.read(frame)) { MOG->apply(frame, mask); threshold(mask, mask, 200, 255, THRESH_BINARY ); morphologyEx(mask, mask, MORPH_OPEN, kernel); dilate(mask, mask, kernel1); vector >contours; vector >EffectiveContours; findContours(mask, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); for (int i = 0; i < contours.size(); i++) { double area = contourArea(contours[i]); if (area > 300) { EffectiveContours.push_back(contours[i]); } } char text[10]; for (int i = 0; i < EffectiveContours.size(); i++) { RotatedRect rect = minAreaRect(EffectiveContours[i]); Rect box = rect.boundingRect(); rectangle(frame, Rect(box.x, box.y, box.width, box.height), Scalar(0, 255, 0), 2); sprintf_s(text, "%s%d", "Current:", EffectiveContours.size()); putText(frame, text, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 255, 0), 2); } imshow("frame", frame); imshow("mask", mask); char key = waitKey(10); if (key == 27) { break; } } destroyAllWindows(); capture.release(); system("pause"); return 0;}
关于OpenCV基于背景减除如何实现行人计数问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
背景
行人
轮廓
统计
人流
人流量
效果
画面
问题
如图
上图
前景
原图
图像
对象
更多
高斯
帮助
混合
解答
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
免流服务器怎么防御
眉山软件开发销售电话
数据库的基本安全要求
小小五千年登陆服务器错误
发件服务器在哪里
服务器托管视频
软件开发游戏开发网络工程
鄞州手机软件开发平台
网络安全教育班会反思
联想服务器维修调试哪家好
服务器 断电
ip数据与网络安全
web网络安全.pdf
长宁区信息网络技术诚信为本
部队网络安全的防范知识
centos开mc服务器
做电子发票软件开发公司
金山区软件开发技术指导
ibm服务器 硬盘灯
服务器内存被禁用怎么办
数据库删除后 怎么再还原
网络安全法确立谁建设
全息视频网络技术可行性
服务器代码10049什么意思
换一个网络安全的图画
如何搭建电子商务网站服务器
网络安全宣传片英语
负责网络安全和监管的部门
世界贸易组织数据库技术提取
数据库搜索模式为几种