OpenCV基于背景减除如何实现行人计数
发表于:2024-11-19 作者:千家信息网编辑
千家信息网最后更新 2024年11月19日,OpenCV基于背景减除如何实现行人计数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言下面将使用OpenCV C++ 对视频中的
千家信息网最后更新 2024年11月19日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安全错误
数据库的锁怎样保障安全
广州邮先生网络技术有限公司
上海翼葵网络技术有限公司
福州数据库培训班
部队网络安全风险隐患
打黄非网络安全视频
国产化服务器市场
珠海校史馆分布式服务器
铜川软件开发操作
网络安全与执法的考研方向
工业网络技术的个人简历
手抄报网络安全文明上网初二
网络安全审查怎么办
四川可视化人口管理系统软件开发
网络安全伴你我微视频
金蝶云服务器超时
关于网络安全的审计报告
贵金属的交易软件开发
服务器标签模板
dell服务器电源改造pc
aspx中用什么数据库
poi中国数据库
校园网络安全技术保障
水果网络技术创作的原声
金苗保一直显示服务器繁忙
北理软件开发研究生补录名单
天津安歌互联网科技有限公司
学习建设网络安全
能上服务器条的主板
空调热管理软件开发
收货地址 数据库