#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. Linux驱动设计——内存与IO访问

    名词解释 内存空间与IO空间 内存空间是计算机系统里面非系统内存区域的地址空间,现在的通用X86体系提供32位地址,寻址4G字节的内存空间,但一般的计算机只安装256M字节或者更少的内存,剩下的高位内 ...

  2. android开源项目---项目篇

    本文转载于:http://blog.csdn.net/likebamboo/article/details/19081151 主要介绍那些Android还不错的完整项目,目前包含的项目主要依据是项目有 ...

  3. 用 jQuery 实现表单验证(摘抄)

    ——选自<锋利的jQuery>(第2版)第5章的例题  5.1.5 表单验证 表单作为 HTML 最重要的一个组成部分,几乎在每个网页上都有体现,例如用户提交信息.用户反馈信息和用户查询信 ...

  4. Attention and Augmented Recurrent Neural Networks

    Attention and Augmented Recurrent Neural Networks CHRIS OLAHGoogle Brain SHAN CARTERGoogle Brain Sep ...

  5. 使用 NGUI 实现头顶文字及血条

    以下是 NGUI HUD Text 实现的: 基本原理: 1. 在角色头顶绑一个点 Pivot,用于对齐 2. 因为界面总是覆盖在人物头顶信息的上面,所以将 UIRoot 分为2个 Panel:1) ...

  6. Avoiding PostgreSQL database corruption

    TL;DR: Don't ever set fsync=off, don't kill -9 the postmaster then deletepostmaster.pid, don't run P ...

  7. c# 获取 webbrowser 完整 cookie

    下面的代码实现的功能确实如标题所言,但要求是获取的是当前进程内的webbrowser,跨进程或引用的ShellWindows对象无效, 哎我本来两种情况都要用,只把前者代码先记下: internal ...

  8. jQuery return false

    在jQuery代码中,我们常见用return false来阻止浏览器的默认行为.例如点击链接,浏览器默认打开一个新窗口/标签,为了阻止浏览器的默认行为,我们往往这样操作: $("a.togg ...

  9. 图片加载js类库

    Picturefill Picturefill.WP插件利用picturefill.js脚本展示Responsive图片,即根据视口宽度选择尺寸合适的图片加载,节省带宽,提高网站载入速度.例如用户用手 ...

  10. 取消GridView/ListView item被点击时的效果

    方法一,在控件被初始化的时候设置 ? 1 2 gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); listView.setSelec ...