1、源代码

#include "stdafx.h"
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv/cv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <time.h>
#include <math.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include<windows.h>
#include <mmsystem.h>//跟踪参数
const double MHI_DURATION = 0.5;//最大跟踪时间
const double MAX_TIME_DELTA = 0.5;
const double MIN_TIME_DELTA = 0.05;
const int N = 3;
const int CONTOUR_MAX_AERA = 100;//矩形面积IplImage **buf = 0;
int last = 0;
int flag;
IplImage *mhi = 0; // MHI: motion history image
CvConnectedComp *cur_comp, min_comp;
CvConnectedComp comp;
CvMemStorage *storage;
CvPoint pt[4];
// img – 输入视频帧
// dst – 检测结果
void update_mhi(IplImage* img, IplImage* dst, int diff_threshold)
{double timestamp = clock() / 100.; //获取当前时间CvSize size = cvSize(img->width, img->height);int i, idx1, idx2;IplImage* silh;IplImage* pyr = cvCreateImage(cvSize((size.width & -2) / 2, (size.height & -2) / 2), 8, 1);CvMemStorage *stor;CvSeq *cont;if (!mhi || mhi->width != size.width || mhi->height != size.height){if (buf == 0){buf = (IplImage**)malloc(N*sizeof(buf[0]));//动态内存分配memset(buf, 0, N*sizeof(buf[0]));}for (i = 0; i < N; i++){cvReleaseImage(&buf[i]);buf[i] = cvCreateImage(size, IPL_DEPTH_8U, 1);cvZero(buf[i]);}cvReleaseImage(&mhi);mhi = cvCreateImage(size, IPL_DEPTH_32F, 1);cvZero(mhi);}cvCvtColor(img, buf[last], CV_BGR2GRAY); //rgb->grayidx1 = last;idx2 = (last + 1) % N;last = idx2;// 做帧差silh = buf[idx2];cvAbsDiff(buf[idx1], buf[idx2], silh); //两帧差异// 对差图像做二值化cvThreshold(silh, silh, 30, 255, CV_THRESH_BINARY); //src(x,y)>threshold ,dst(x,y) = max_value; 否则,dst(x,y)=0;cvUpdateMotionHistory(silh, mhi, timestamp, MHI_DURATION); //更新像素点的运动历史cvCvtScale(mhi, dst, 255. / MHI_DURATION,(MHI_DURATION - timestamp)*255. / MHI_DURATION);//timestamp是时间戳;MHI_DURATION,获得的是当前时间cvCvtScale(mhi, dst, 255. / MHI_DURATION, 0);// 中值滤波,消除小的噪声cvSmooth(dst, dst, CV_MEDIAN, 3, 0, 0, 0);// 向下采样,去掉噪声cvPyrDown(dst, pyr, 7);cvDilate(pyr, pyr, 0, 1); // 做膨胀操作,消除目标的不连续空洞cvPyrUp(pyr, dst, 7);//// 下面的程序段用来找到轮廓//// Create dynamic structure and sequence.stor = cvCreateMemStorage(0);cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), stor);// 找到所有轮廓cvFindContours(dst, stor, &cont, sizeof(CvContour),CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));// 直接使用CONTOUR中的矩形来画轮廓for (; cont; cont = cont->h_next){flag = 0;CvRect r = ((CvContour*)cont)->rect;if (r.height * r.width > CONTOUR_MAX_AERA){cvRectangle(img, cvPoint(r.x, r.y),cvPoint(r.x + r.width, r.y + r.height),CV_RGB(255, 0, 0), 1, CV_AA, 0);flag = 1;}else{flag = 0;}}cvReleaseMemStorage(&stor);cvReleaseImage(&pyr);
}int main(int argc, char** argv)
{IplImage* motion = 0;CvCapture* capture = 0; //视频获取结构 while (1){//capture = cvCreateCameraCapture(0);//读摄像头视频capture = cvCreateFileCapture("C:\\Users\\Lijunliang\\Desktop\\0.5X.avi");    //读本地视频文件if (capture){cvNamedWindow("Motion", 1);for (;;){SYSTEMTIME sys;//获取当前系统时间GetLocalTime(&sys);char* t_y = new char[128];sprintf(t_y, ("%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d"),sys.wYear, sys.wMonth, sys.wDay,sys.wHour, sys.wMinute, sys.wSecond);CvFont font;cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX, 0.5, 0.5, 0, 2, 8);IplImage* image;if (!cvGrabFrame(capture)) //从摄像头或者视频文件中抓取帧break;image = cvRetrieveFrame(capture); //取回由函数cvGrabFrame抓取的图像,返回由函数cvGrabFrame 抓取的图像的指针if (image){if (!motion){motion = cvCreateImage(cvSize(image->width, image->height), 8, 1);cvZero(motion);motion->origin = image->origin; ///* 0 - 顶—左结构, 1 - 底—左结构 (Windows bitmaps 风格) */}}update_mhi(image, motion, 6);cvPutText(image, t_y, cvPoint(10, 25), &font, CV_RGB(255, 0, 0));cvShowImage("Motion", image);if (cvWaitKey(10) >= 0)break;}cvReleaseCapture(&capture);cvDestroyWindow("Motion");}}return 0;
}

2、实验结果

注:使用的检测源文件是是基于solidworks下路径配合做的动画视频,目的是避免噪声干扰和前景干扰,也就是在相当理想的情况环境下进行检测与跟踪,由结果可知检测与跟踪结果完美。使用者可以结合自己的使用对源程序稍加修改。

基于OpenCV的多目标动态检测与跟踪相关推荐

  1. 基于opencv的BackgroundSubtractorMOG2目标追踪

    基于opencv的BackgroundSubtractorMOG2目标追踪 BackgroundSubtractorMOG2是以高斯混合模型为基础的背景/前景分割算法.它是以2004年和2006年Z. ...

  2. 基于OpenCV的视频处理 - 人脸检测

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com  Time of completion:2023.2.7 Las ...

  3. Python基于Opencv的鱼群密度速度检测系统(源码&教程)

    1.研究背景 智慧渔业是大数据.物联网与人工智能等现代信息技术驱动下的渔业发展新模式,是水产养殖业供给侧结构性改革的重要方式,涉及养殖环境监测.生物环境监测与生物状态监测这几大方面的应用与需求.本文从 ...

  4. 基于OpenCV的视频道路车道检测

    基于OpenCV的视频道路车道检测 基于OpenCV的视频道路车道检测 前言 综述 运行方法 车道检测的实现 路面图像二值化 基于透视变换提取车道区域 基于二次多项式拟合车道线 计算曲率半径与车辆的偏 ...

  5. python 视频人脸替换_Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys ...

  6. python视频人脸检测_Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys ...

  7. Python基于OpenCV的指针式表盘检测系统(附带源码&技术文档)

    1.背景 指针式机械表盘具有安装维护方便.结构简单.防电磁干扰等诸多优点, 目前广泛应用于工矿企业.能源及计量等部门.随着仪表数量的增加及精密仪表技术的发展,人工判读已经不能满足实际应用需求.随着计算 ...

  8. 基于OpenCV的行人目标检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...

  9. 基于OpenCV的实战:轮廓检测(附代码解析)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 利用轮廓检测物体可以看到物体的各种颜色,在这种情况下放置在静态和动 ...

  10. 基于OpenCV的焊件缺陷检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 01. 简介 焊接缺陷是指焊接零件表面出现不规则.不连续的现象.焊 ...

最新文章

  1. C++泛型编程:template模板
  2. 目前我国负债超过100万的大概有多少人?
  3. h5外卖源码php_校园食堂外卖APP走红 更多APP定制开发上一品威客网
  4. 1057 数零壹 (20 分)
  5. pytorch神经网络因素预测_实战:使用PyTorch构建神经网络进行房价预测
  6. Zookeeper工作原理(详细)
  7. CentOS 7下载安装MySQL 5.7以及连接虚拟机CentOS 7数据库教程
  8. Tensorflow CIFAR10 (二分类)
  9. Ubuntu 重置密码
  10. android手机做电脑的显示器,怎样用手机当电脑显示器
  11. 竖流式沉淀池三角堰计算_一种辐流式沉淀池的双侧堰出水构造的制作方法
  12. iOS开发--AVPlayer实现音乐播放器
  13. ptb同一屏呈现两张图片matlab,PTB诊断心电数据库中的原始ECG信号的特征提取
  14. 根据光时域反射仪原理飞凌提供专业性的应用方案
  15. <script>标签通过src属性调用js文件
  16. 清华小学上册计算机教学案例,案例分析 清华小学 罗远琴
  17. .dcm格式文件软件读取及python处理
  18. django中queryset的两大特性
  19. The King’s Ups and Downs HDU - 4489
  20. 【软件测试】移动端测试金字塔

热门文章

  1. Java之将GB2312编码转化为汉字
  2. 基于51单片机的教室人数检测
  3. Mybatis快速入门及遇到的问题(不支持发行版本)(黑马程序员Javaweb)
  4. 乡镇政府网络智能办公系统(乡镇OA)应用【乡镇信息化经验】
  5. Qimera和Fledermas处理大批量多波束数据的思考
  6. Java批量png转jpg图片格式
  7. 北大开源ECCV2018深度去雨算法:RESCAN
  8. 嵌入式和单片机的区别是什么
  9. Latex:表格插入图片
  10. 不卖菜,互联网巨头应该卖什么?