MHI ,运动历史图像的的获取[下载自CSDN]
#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]的更多相关文章
- OpenCV3.1.0中调用MHI(Motion History Images, 运动历史图像)
写在前边: OpenCV3.0+要想使用MHI,就要现安装扩展模块opencv_contrib.安装方法见:ubuntu 14.04 64位 安装Opencv3.1.0 (包含opencv_contr ...
- c#图像处理入门(-bitmap类和图像像素值获取方法)
c#图像处理入门 -bitmap类和图像像素值获取方法 一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义 ...
- 最新版ChemDraw 15.1 免费获取下载
ChemDraw 15.1 Pro是最新版的ChemOffice套件的个人生产力工具,它可以帮助科学家有效地捕捉和分享工作内容,通过可视化功能对结果获得更深入的了解.现在为大家带来好消息,ChemOf ...
- php 微信开发之新增上传/获取下载临时素材
php 微信开发之新增上传/获取下载临时素材 代码 <?php define("AppID","");//你的id define("AppSec ...
- 如何获取下载 FreeBSD
『如何获取下载 FreeBSD 』 『如何获取下载 FreeBSD 』 FreeBSD 是免费获取的. [下载地址] O网页链接 版本选择,尽量选择较新版本,桌面用户可选择 current 版本.st ...
- Ueditor文本编辑器(新浪SAE平台版本) - 下载频道 - CSDN.NET
Ueditor文本编辑器(新浪SAE平台版本) - 下载频道 - CSDN.NET Ueditor文本编辑器(新浪SAE平台版本)
- C#中的bitmap类和图像像素值获取方法
一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...
- c#图像处理入门(-bitmap类和图像像素值获取方法) 转
一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...
- 【UE4】如何获取/下载虚幻4(Unreal Engine4)源码
在官网中点击[获取虚幻引擎]可以看到,虚幻4完整源代码已经放在Github上,所以与其用百度搜别人的资源,当然是直接上Github下啊. 主要步骤如下: 注册一个Github帐号,这个没啥值得说的. ...
随机推荐
- Android实现拖动进度条改变图片透明度
layout文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...
- c语言开发手机通讯录
// // main.c // 手机通讯录 // // Created by Kevin-Dfg on 16/4/19. // Copyright © 2016年 Kevin-Dfg. All ...
- JS中的call()方法的理解
fn.call(obj,arg1,arg2);这是call()方法的使用形式,apply()是差不多的.作用是用obj对象来替换fn中的this 举个栗子: function A(){ this.co ...
- kuangbin_ShortPath P (HDU 4725)
很有挑战的一题 直接暴力建图的话毫无疑问O(n^2)会TLE 每层虚拟一个点又会让没有点的层也能连过去 参考kuangbin菊苣的方法每层用了两个虚拟点 n+i*2-1 是入口 n+i*2 是出口 然 ...
- network Driver , TDI(Transport Driver Interface) Drivers
https://msdn.microsoft.com/en-us/library/windows/hardware/ff565094(v=vs.85).aspx https://msdn.micros ...
- Unity资源管理与更新
当你在 工程目录下的 Asset 文件夹中放置一个文件时(电脑上的文件夹,不是 Unity 界面中的文件夹),Unity会自动检测到一个新的文件被添加(Unity会不停地检查Assets文件夹中的内容 ...
- 套接字I/O模型-select
共有6种类型套接字I/O模型.blocking(阻塞),select(选择),WSAAsyncSelect(异步选择),WSAEventSelect(事件选择),overlapped(重叠),comp ...
- #你好Unity3D#Hierarchy视图监听gameObject点击事件
今天无意间又找到了个好方法 1 2 3 4 5 6 7 8 9 10 [InitializeOnLoadMethod] static void Start () { Selection.s ...
- 基于OkHttp的封装库TigerOkHttp的使用
在前面熟悉了OkHttp的用法之后,为了简化用法同时适用于我的项目,我针对OkHttp进行了更进一步的封装(源码及其Demo地址在https://github.com/huyongli/TigerOk ...
- 在OCR文字识别软件选项卡中怎么设置图像和文字
PDF是广泛使用的文档格式.在ABBYY Finereader中,PDF文档的显示不会因电脑不同而有差异,可加密保护,非常适合在电子存档中进行保存.下面给 大家讲解如何在PDF选项设置图像和文字. 图 ...