OpenCV基于背景减除如何实现行人计数
发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,OpenCV基于背景减除如何实现行人计数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言下面将使用OpenCV C++ 对视频中的
千家信息网最后更新 2025年11月14日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安全错误
数据库的锁怎样保障安全
远程服务器工作时电脑可以关机吗
临沂互联网科技有限公司
网络技术运营师
软件开发外派国外
选修3网络技术应用会考卷子
数据库住院管理系统
怎么用中油好客e站软件开发票
贯彻落实网络安全会议内容
市辖软件开发
传统服务器管理能力
恒玄科技和小米互联网
哪个服务器可以转服到黄金台
服务器和粉丝可以一起用吗
学生画网络安全手抄报
服务器区防火墙怎么部署
成都高仿服务器
个人简介软件开发人员
一个服务器能扯几个网线
软件开发吴老师
信息系统有几个数据库
电算化审计软件开发
网络安全管理技术教程网
网络安全是怎么产生的
软件开发的创意
黑皇软件开发
皇室战争分服务器么
软件开发负责人的资质
血缘诅咒服务器
杭州网络安全培训学费多少
自动化材料数据库