OpenCV基于背景减除如何实现行人计数
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,OpenCV基于背景减除如何实现行人计数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言下面将使用OpenCV C++ 对视频中的
千家信息网最后更新 2026年11月02日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安全错误
数据库的锁怎样保障安全
中关村互联网 科技集团
互联网科技开发公司
迪茉互联网科技
互联网科技英文翻译
重庆科技学院互联网
卓越科技互联网 招聘
富国互联网科技创新基金
科技与互联网的利与弊
创业天下互联网科技有限公司
苏州五指互联网络科技有限
花神(南京)互联网科技有限公司
青岛科技大学互联网大赛研究生
民营互联网公司国防科技
互联网科技创新的路径
山东有哪些互联网科技公司
元气玛特互联网科技公司是外包吗
伍佰万互联网科技怎么赚钱
智帮互联网科技公司最近动向
广州百诚互联网科技有限公司官网
互联网硬科技公司
互联网的科技
互联网科技公司税收优惠
猪兼强互联网科技
互联网科技咨询
中国的互联网科技企业的崛起
互联网科技研发水平
徐州市互联网科技有限公司
山东子淼互联网科技有限公司
启辰互联网科技
21世纪互联网科技成就