#include "cv.h"
#include "highgui.h"
#include "stdlib.h"
#include "malloc.h"
#include "cxcore.h"
#include "assert.h"
#include <time.h>
#include <math.h>
#include <ctype.h>
#include <stdio.h>
#include <iostream> using namespace std; // various tracking parameters (in seconds)
const double MHI_DURATION = ;
const double MAX_TIME_DELTA = 0.5;
const double MIN_TIME_DELTA = 0.05;
// number of cyclic frame buffer used for motion detection
// (should, probably, depend on FPS)
//用于运动检测的循环帧数
const int N = ; // ring image buffer
IplImage **buf = ;
int last = ; // temporary images
IplImage *mhi = ; // MHI
IplImage *orient = ; // orientation
IplImage *mask = ; // valid orientation mask
IplImage *segmask = ; // motion segmentation map
CvMemStorage* storage = ; // temporary storage // parameters:
// img - input video frame
// dst - resultant motion picture
// args - optional parameters
void update_mhi(IplImage* img, IplImage* dst, int diff_threshold)
{
double timestamp = (double)clock() / CLOCKS_PER_SEC; // get current time in seconds
CvSize size = cvSize(img->width, img->height); // get current frame size
int i, idx1 = last, idx2;
IplImage* silh;
CvSeq* seq;
CvRect comp_rect;
double count;
double angle;
CvPoint center;
double magnitude;
CvScalar color; // allocate images at the beginning or 为图像分配初始空间
// reallocate them if the frame size is changed 当帧的大小改变时,重新分配内存空间
if (!mhi || mhi->width != size.width || mhi->height != size.height)
{
if (buf == )
{
buf = (IplImage**)malloc(N*sizeof(buf[]));
memset(buf, , N*sizeof(buf[]));//把申请到的内存空间用0初始化
} for (i = ; i < N; i++) {
cvReleaseImage(&buf[i]);
buf[i] = cvCreateImage(size, IPL_DEPTH_8U, );
cvZero(buf[i]);
}
cvReleaseImage(&mhi);
cvReleaseImage(&orient);
cvReleaseImage(&segmask);
cvReleaseImage(&mask); mhi = cvCreateImage(size, IPL_DEPTH_32F, );
cvZero(mhi); // clear MHI at the beginning
orient = cvCreateImage(size, IPL_DEPTH_32F, );
segmask = cvCreateImage(size, IPL_DEPTH_32F, );
mask = cvCreateImage(size, IPL_DEPTH_8U, );
} cvCvtColor(img, buf[last], CV_BGR2GRAY); // convert frame to grayscale 转换为灰度图 idx2 = (last + ) % N; // index of (last - (N-1))th frame
last = idx2;
silh = buf[idx2];
cvAbsDiff(buf[idx1], buf[idx2], silh); // get difference between frames相邻两帧之差 cvThreshold(silh, silh, diff_threshold, , CV_THRESH_BINARY); // and threshold it
cvUpdateMotionHistory(silh, mhi, timestamp, MHI_DURATION); // update MHI // convert MHI to blue 8u image
cvCvtScale(mhi, mask, . / MHI_DURATION,
(MHI_DURATION - timestamp)*. / MHI_DURATION);
cvZero(dst);
cvCvtPlaneToPix(mask, , , , dst); // calculate motion gradient orientation and valid orientation mask计算运动的梯度方向以及正确的方向掩码
cvCalcMotionGradient(mhi, mask, orient, MAX_TIME_DELTA, MIN_TIME_DELTA, ); if (!storage)
storage = cvCreateMemStorage();
else
cvClearMemStorage(storage); // segment motion: get sequence of motion components运动分割:获取运动组成成分的序列
// segmask is marked motion components map. It is not used further
seq = cvSegmentMotion(mhi, segmask, storage, timestamp, MAX_TIME_DELTA); // iterate through the motion components,迭代运动的组成成分
// One more iteration (i == -1) corresponds to the whole image (global motion)
for (i = -; i < seq->total; i++)
{ if (i < )
{ // case of the whole image
comp_rect = cvRect(, , size.width, size.height);
color = CV_RGB(, , );
magnitude = ;
}
else
{ // i-th motion component
comp_rect = ((CvConnectedComp*)cvGetSeqElem(seq, i))->rect;
if (comp_rect.width + comp_rect.height < ) // reject very small components
continue;
color = CV_RGB(, , );
magnitude = ;
} // select component ROI
cvSetImageROI(silh, comp_rect);
cvSetImageROI(mhi, comp_rect);
cvSetImageROI(orient, comp_rect);
cvSetImageROI(mask, comp_rect); // calculate orientation在选择区域内计算运动方向
angle = cvCalcGlobalOrientation(orient, mask, mhi, timestamp, MHI_DURATION);
angle = 360.0 - angle; // adjust for images with top-left origin count = cvNorm(silh, , CV_L1, ); // calculate number of points within silhouette ROI cvResetImageROI(mhi);
cvResetImageROI(orient);
cvResetImageROI(mask);
cvResetImageROI(silh); // check for the case of little motion
if (count < comp_rect.width*comp_rect.height * 0.05)
continue; //// draw a clock with arrow indicating the direction画一个“钟表”指向运动的方向
//center = cvPoint((comp_rect.x + comp_rect.width / 2),
// (comp_rect.y + comp_rect.height / 2)); //cvCircle(dst, center, cvRound(magnitude*1.2), color, 3, CV_AA, 0);
//cvLine(dst, center, cvPoint(cvRound(center.x + magnitude*cos(angle*CV_PI / 180)),
// cvRound(center.y - magnitude*sin(angle*CV_PI / 180))), color, 3, CV_AA, 0);
}
} int main(int argc, char** argv)
{
IplImage* motion = ;
CvCapture* capture = ; capture = cvCaptureFromFile("E:\Videos\\daria_walk.avi"); if (capture)
{
cvNamedWindow("Motion", ); for (;;)
{
IplImage* image;
if (!cvGrabFrame(capture))
break;
//Decodes and returns the grabbed video frame.
//C++: bool VideoCapture::retrieve(Mat& image, int channel=0)
// IplImage* cvRetrieveFrame(CvCapture* capture, int streamIdx=0 )
image = cvRetrieveFrame(capture); if (image)
{
if (!motion)
{
//Creates an image header and allocates the image data.
//C: IplImage* cvCreateImage(CvSize size, int depth, int channels)
motion = cvCreateImage(cvSize(image->width, image->height), , );
//Clears the array.
//C: void cvSetZero(CvArr* arr)
cvZero(motion);
motion->origin = image->origin;
}
} update_mhi(image, motion, );
cvShowImage("Motion", motion); if (cvWaitKey() >= )
break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("Motion");
} return ; }

MHI ,运动历史图像的的获取[下载自CSDN]的更多相关文章

  1. OpenCV3.1.0中调用MHI(Motion History Images, 运动历史图像)

    写在前边: OpenCV3.0+要想使用MHI,就要现安装扩展模块opencv_contrib.安装方法见:ubuntu 14.04 64位 安装Opencv3.1.0 (包含opencv_contr ...

  2. c#图像处理入门(-bitmap类和图像像素值获取方法)

    c#图像处理入门 -bitmap类和图像像素值获取方法 一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义 ...

  3. 最新版ChemDraw 15.1 免费获取下载

    ChemDraw 15.1 Pro是最新版的ChemOffice套件的个人生产力工具,它可以帮助科学家有效地捕捉和分享工作内容,通过可视化功能对结果获得更深入的了解.现在为大家带来好消息,ChemOf ...

  4. php 微信开发之新增上传/获取下载临时素材

    php 微信开发之新增上传/获取下载临时素材 代码 <?php define("AppID","");//你的id define("AppSec ...

  5. 如何获取下载 FreeBSD

    『如何获取下载 FreeBSD 』 『如何获取下载 FreeBSD 』 FreeBSD 是免费获取的. [下载地址] O网页链接 版本选择,尽量选择较新版本,桌面用户可选择 current 版本.st ...

  6. Ueditor文本编辑器(新浪SAE平台版本) - 下载频道 - CSDN.NET

    Ueditor文本编辑器(新浪SAE平台版本) - 下载频道 - CSDN.NET Ueditor文本编辑器(新浪SAE平台版本)

  7. C#中的bitmap类和图像像素值获取方法

    一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...

  8. c#图像处理入门(-bitmap类和图像像素值获取方法) 转

    一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...

  9. 【UE4】如何获取/下载虚幻4(Unreal Engine4)源码

    在官网中点击[获取虚幻引擎]可以看到,虚幻4完整源代码已经放在Github上,所以与其用百度搜别人的资源,当然是直接上Github下啊. 主要步骤如下: 注册一个Github帐号,这个没啥值得说的. ...

随机推荐

  1. JAVA常用运算符

    Java 语言中常用的运算符可分为如下几种: 1.算术运算符 int i = 5; int j = i++; // i = 6 j = 5 int j = ++i; // i = 6 j = 6 PS ...

  2. 编码规范(一)之Code Templates的设置(转)

    编码规范(一)之Code Templates的设置 基于公司的主流开发工具为eclipse,但每个人都有自己的编码习惯,为了统一格式,这里通过三个方面:设置Code Templates.Checkst ...

  3. Visible 绑定

    目的 Visible绑定通过绑定一个值来确定DOM元素显示或隐藏 <script src="knockout.js"></script><div da ...

  4. Java——多线程

     /* * 进程: 正在 进行中的程序 * 线程:就是进程中一个负责程序执行的控制单元(执行路径) * 一个进程中可以有多个执行路径,称之为多线程. * * 一个进程中至少要有一个线程. * *  ...

  5. T恤

    64%聚酯纤维+36%纯棉比较舒服,洗了不易变形,普通纯棉易变形

  6. 原版本的jquery 开发过程中发现jquery好像更新了

    /*! jQuery v1.7.1 jquery.com | jquery.org/license */ (function(a,b){function cy(a){return f.isWindow ...

  7. Floating Action Button(漂浮按钮)

    参考:http://blog.csdn.net/pengkv/article/details/46427891 效果图: 步骤一: 在build.gradle添加以下代码,导入包 dependenci ...

  8. ExtJs 入门教程

    http://www.cnblogs.com/iamlilinfeng/archive/2012/12/31/2840663.html

  9. python扫描内网banner信息

    小菜自己无聊写着玩,主要纪念以前的逗逼学习,可以改IPy import mechanize import cookielib import socket import argparse import ...

  10. 使用SQL Server存储ASP.NET Session变量

    创建和配置ASP.NET Session状态数据库 在基于NLB(网络负载平衡)环境下的ASP.NET Web应用程序开发,我们需要将Session存储在数据库中供多个Web应用程序调用,以下为配置方 ...