关注我,并留言,不定期送各种c++资料
代码全部在下面,就一个文件,随便添加一个空项目后就可以将下面代码替换到工程中。具体操作步骤没时间过多的写,可以看注释。代码运行没有问题,我用的是opencv344和vs2017。需要源代码和资料的请在这里下载,在我的工程里面环境已经配置好https://download.csdn.net/download/qq_41476542/14046884
代码如下:

#include<iostream>
#include<opencv2/opencv.hpp>
#include <sstream>
using namespace std;//命名空间std
using namespace cv;//命名空间cvv b
string int2str(const int &int_temp)//数据流之间的转换
{stringstream stream;//通过流来实现字符串和数字的转换string string_temp;//有不限长度的优点stream << int_temp; //将int输入流,向左移4位string_temp = stream.str();  //此处也可以用 stream>>string_temp//从stream中抽取前面插入的int值return string_temp;
} int main(int argc, const char** argv)
{VideoCapture cap;//打开摄像头对象bool update_bg_model = true;cap.open(0);// cap.open("http://113.57.246.23:8080/shot.jpg");cap.open("C:\\Users\\Administrator\\Desktop\\acvis09-5950.avi");//cap.open("D:\\qq\\demo\\vtest.avi");  if (!cap.isOpened()){printf("can not open camera or video file\n");return -1;}namedWindow("image", WINDOW_AUTOSIZE);namedWindow("foreground mask", WINDOW_AUTOSIZE);//保持原图大小namedWindow("foreground image", WINDOW_AUTOSIZE);//namedWindow("mean background image", WINDOW_AUTOSIZE);//原图大小Ptr<BackgroundSubtractorMOG2> bg_model = createBackgroundSubtractorMOG2();//(100, 3, 0.3, 5);建立背景模型Mat img, fgmask, fgimg;//定义矩阵int i = 0;for (;;)//死循环{i++;cap >> img;//由capture类输出图像if (img.empty())break;img = img(Rect(40, 0, 300, img.rows));if (fgimg.empty())fgimg.create(img.size(), img.type());//更新模型bg_model->apply(img, fgmask, update_bg_model ? -1 : 0);//背景模型的跟新medianBlur(fgmask, fgmask, 13);//有效抑制噪声的中值滤波函数,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值。输入图像输出图像尺寸大小,必须是大于1的奇数,如3、5、7……threshold(fgmask, fgmask, 150, 255, THRESH_BINARY);//# 阈值化,将非纯白色(244~255)的所有像素设为0Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));//  # 为了使效果更好,进行一次膨胀/*erode(fgmask, fgmask, element, Point(0, 0), 3);dilate(fgmask, fgmask, element, Point(0, 0), 3);*/Mat srcGrayImage = fgmask.clone();vector<vector<Point>> vContours;vector<Vec4i> vHierarchy;//  # 检测轮廓findContours(srcGrayImage, vContours, vHierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE, Point(0, 0));int count = 0;RNG rng(12345);//构造方法设定一个具体值,表示下面代码每次生成的结果都是一样的
for (int i = 0; i < vContours.size(); i++){
double area = contourArea(vContours[i], false);  //RotatedRect该类表示平面上的旋转矩形,该类对象有三个重要属性://矩形中心点(质心),边长(长和宽),旋转角度。三种构造函数和三种成员操作函数RotatedRect smallRect = minAreaRect(vContours[i]);/*   RotatedRect该类表示平面上的旋转矩形,有三个属性:矩形中心点(质心)边长(长和宽)旋转角度
*/
Point2f smallRect_center = smallRect.center;float smallRect_width = smallRect.size.width;float smallRect_height = smallRect.size.height;float smallRect_angle = 0;smallRect = RotatedRect(smallRect_center, Size2f(smallRect_height, smallRect_width), smallRect_angle);//若使用Point2f,这里就使用flow1_at_point.x形式存取像素值Point2f P[4];//points()函数用于求矩形的4个顶点,smallRect.points(P);if (area>600 && area < 3000){count++;for (int j = 0; j <= 3; j++){//划线,绘制在img上line(img, P[j], P[(j + 1) % 4], Scalar(255, 0, 0), 2);}}if (area>3000&& area < 5000){count += 2;for (int j = 0; j <= 3; j++){line(img, P[j], P[(j + 1) % 4], Scalar(255, 0, 0), 2);}}}//任意值//数数的颜色Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));//写字参数1:, Mat& img,待写字的图片,我们写在img图上/*参数2:,const string& text,待写入的字,我们下面写入Hello参数3:, Point org, 第一个字符左下角坐标,我们设定在图片的Point(50, 60)坐标。表示x = 50, y = 60。参数4:,int fontFace,字体类型,FONT_HERSHEY_SIMPLEX ,FONT_HERSHEY_PLAIN ,FONT_HERSHEY_DUPLEX 等等等。参数5:,double fontScale,字体大小,我们设置为2号参数6:,Scalar color,字体颜色,颜色用Scalar()表示,不懂得去百度。参数7:, int thickness,字体粗细,我们下面代码使用的是4号参数8:, int lineType,线型,我们使用默认值8.*/putText(img, int2str(count), Point(220, 40), FONT_HERSHEY_TRIPLEX, 1, color, 2);//设定所有的值为0.得到前景fgimg = Scalar::all(0);img.copyTo(fgimg, fgmask);Mat bgimg;得到背景bg_model->getBackgroundImage(bgimg);//?imshow("image", img);/*string windows_name = "Video/image_" + int2str(i);string windows_name_ext = windows_name + ".jpg";imwrite(windows_name_ext, img);*/imshow("foreground mask", fgmask);imshow("foreground image", fgimg);//是否图像读入if (!bgimg.empty())imshow("mean background image", bgimg);char k = (char)waitKey(1);if (k == 27) break;if (k == ' '){update_bg_model = !update_bg_model;if (update_bg_model)printf("\t>背景更新(Background update)已打开\n");else printf("\t>背景更新(Background update)已关闭\n");}}return 0;
}

基于OpenCV高斯模型的公共场景人流量统计相关推荐

  1. 基于混合高斯模型与帧差法结合的目标跟踪算法matlab仿真

    目录 一.理论基础 二.核心程序 三.仿真测试结果 一.理论基础 目标检测:混合高斯模型与帧差法结合的算法,与单独的混合高斯模型算法作对比,体现前者的优越性 3.要求和结果:对比改进前后的算法,可以非 ...

  2. 基于动态混合高斯模型的商品价格模型算法

    1. 背景 作为电子商务网站,淘宝网上的每个商品都有一个价格,该价格从一个很重要的维度上反应出一个商品的品质.但是由于该价格是由第三方卖家自己确定的,因此存在一定的随机性.一个价格过低的商品,其假货的 ...

  3. 混合高斯模型去除背景

    本文转自 http://www.cnblogs.com/mfryf/archive/2012/03/29/2424024.html 基于混合高斯模型去除背景法 高斯模型去除背景法也是背景去除的一种常用 ...

  4. 混合高斯模型介绍以及应用

    混合高斯模型 1. 单一的高斯模型(Gaussian single model, GSM) 2. 混合高斯模型(GMM模型) 2.1 混合高斯模型直观上的理解和描述 2.2 极大似然估计(Maximu ...

  5. opencv进阶-背景建模-(帧差法与混合高斯模型)

    背景减除(Background Subtraction)是许多基于计算机视觉的任务中的主要预处理步骤.如果我们有完整的静止的背景帧,那么我们可以通过帧差法来计算像素差从而获取到前景对象.但是在大多数情 ...

  6. OPENCV混合高斯模型原理

    (本文转自转自:http://blog.sina.com.cn/s/blog_62bce98c0100shkq.html) 混合高斯模型跟高斯变量之和看起来有一点像, 注意不要把它们弄混淆了. 混合高 ...

  7. 混合高斯模型 opencv

    一.GMM发展历史及现状 背景建模方法有很多种,如中值法.均值法.卡尔曼滤波器模型.码本背景模型等,其中混合高斯模型是最经典的算法.GMM最早是由CHris Stauffer等在[1]中提出的,该方法 ...

  8. 【opencv】(11) 背景建模,帧差法、混合高斯模型,实战:行人检测,附python完整代码和数据集

    各位同学好,今天和大家分享一下opencv背景建模相关操作.主要介绍两种背景建模方法,帧差法和混合高斯模型. 案例简介:现有一份路口摄像机拍摄的行人流视频,通过背景建模方法,区分背景和前景,完成行人识 ...

  9. 9.2【彩色模型】-----基于Opencv实现-----把一幅RGB图转为CMY图

    (一)CMY模型 CMY(Cyan,Magenta,Yellow)模型是采用青,品红,黄色3种基本原色按一定比例合成颜色的方法,由于色彩的显示不是直接来自于光线的色彩,而是光线被物理吸收掉一部分之后反 ...

最新文章

  1. python学习 day2 (3月2日)
  2. BOOST使用 proto::extends 扩展终端类型的简单示例
  3. 西北工业大学matlab安装,西北工业大学Matlab实验报告.doc
  4. iOS KVO crash 自修复技术实现与原理解析
  5. STM32移植freemodbusRTU(hal库)从机
  6. python按行读取csv文件_python.csv 按行按列读取
  7. c++ 调用python_闲话python 48: C/C++扩展Python与Swig工具
  8. 定时任务schedule(spring boot )
  9. 电路基础知识 -- 虚短和虚断
  10. Android 事件拦截分发
  11. Web 全栈大会:万维网之父的数据主权革命
  12. ECCV 2020预会议 直播笔记| Suppress and Balance: A Simple Gated Network for Salient Object Detection
  13. 智能对话平台UNIT 7.0三大引擎正式亮相
  14. oracle执行计划耗费 基数 字节,Oracle 查看执行计划
  15. 实习生招聘收割阿里、腾讯等大厂Offer后,有些话想和应届生说
  16. 查看进程占用的句柄数
  17. vc++ 调用winapi调节屏幕亮度
  18. 原生JS实现的滚动抽奖工具(可设置每个奖品概率、滚动速度、滚动圈数)
  19. 企业为什么要做软文营销
  20. HDOJ 1000A + B Problem最短代码探索

热门文章

  1. linux 下的 多线程http 下载器
  2. 关于若干数据库数据插入性能的对比
  3. 20种处理照片的PS技术
  4. Windows Forms Programming In C# 读书笔记 - 第三章 Dialogs
  5. “===” 也有不靠谱的时候
  6. @ConditionalOnMissingBean注解理解
  7. spring 深入reading
  8. 自由缩放属性resize
  9. VS2010Web默认的浏览器设置和VS里调试JavaScript代码的设置
  10. 国内外常用Linux服务器控制面板介绍