当前位置:首页 > 代码 > 正文

运动目标检测代码(运动目标检测技术研究)

admin 发布:2022-12-31 13:00 53


本篇文章给大家谈谈运动目标检测代码,以及运动目标检测技术研究对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

运动目标检测 高斯混合模型 matlab

--------------------------------------------------------------------------

% 基于中位数算法的运动目标检测

% 第1种实现方法

%--------------------------------------------------------------------------

%*******************************读取视频数据********************************

% 调用aviread函数读取视频文件

vid = aviread('WalkingMan.avi')

size(vid(1).cdata) % 查看第1帧的大小,也是每一帧的大小

vid(1).colormap % 查看第1帧的colormap值

%*****************************数据类型的转换********************************

% 把vid的cdata字段的取值转换成一个240×360×3×80的四维数组IM

IM = cat(4,vid.cdata);

size(IM) % 查看IM的大小

[m,n,k,h] = size(IM); % 把IM的大小赋给四个变量

% 把IM转换成一个80行,240×360×3列的矩阵

I = reshape(IM,[m*n*k,h])';

%********************调用median函数求中位数,进行视频图像分割****************

I = median(I); % 求I矩阵中各列元素的中位数

I = reshape(I,[m,n,k]); % 将向量I转成240×360×3的三维数组,得到背景图像

figure; % 新建一个图形窗口

imshow(I); % 显示背景图像

figure; % 新建一个图形窗口

imshow(IM(:,:,:,1) - I); % 显示第1帧中的目标图像

%--------------------------------------------------------------------------

% 基于中位数算法的运动目标检测

% 第1种实现方法

%--------------------------------------------------------------------------

% 调用mmreader函数创建读取视频文件的多媒体阅读对象WalkManObj

WalkManObj = mmreader('WalkingMan.avi');

% 根据多媒体阅读对象WalkManObj,读取视频的各帧图像数据

IM = read(WalkManObj, [1, inf]);

[m,n,k,h] = size(IM); % 把IM的大小赋给四个变量

% 把IM转换成一个80行,240×360×3列的矩阵

I = reshape(IM,[m*n*k,h])';

I = median(I); % 求I矩阵中各列元素的中位数

I = reshape(I,[m,n,k]); % 将向量I转成240×360×3的三维数组,得到背景图像

figure; % 新建一个图形窗口

imshow(I); % 显示背景图像

figure; % 新建一个图形窗口

imshow(IM(:,:,:,1) - I); % 显示第1帧中的目标图像

MTD是什么意思

MTD是“Microwave Traffic Detector”的缩写,是一种科技产品:双雷达微波交通检测器。

MTD(moving targets detection动目标检测)雷达系统中区分运动目标和杂波在于它们速度上的差别。由于速度不同而引起回波信号的多普勒频率不相等,所以可以通过多普勒频率的不同将杂波和运动目标区分开来。

动目标检测(MTD)不仅能滤除杂波,而且还可以将不同运动速度的目标区分开来,从而大大改善了在杂波背景下检测运动目标的能力,提高了雷达性能。

扩展资料:

MTD的块设备节点:

一、Flash硬件驱动层:硬件驱动层负责在init时驱动Flash硬件,Linux MTD设备的NOR Flash芯片驱动遵循CFI接口标准,其驱动程序位于drivers/mtd/chips子目录下。NAND型Flash的驱动程序则位于/drivers/mtd/nand子目录下

二、MTD原始设备:原始设备层有两部分组成,一部分是MTD原始设备的通用代码,另一部分是各个特定的Flash的数据,例如分区。

三、MTD设备层:基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)和字符设备(设备号90)。MTD字符设备的定义在mtdchar.c中实现,通过注册一系列file operation函数(lseek、open、close、read、write)。MTD块设备则是定义了一个描述MTD块设备的结构 mtdblk_dev,并声明了一个名为mtdblks的指针数组,这数组中的每一个mtdblk_dev和mtd_table中的每一个 mtd_info一一对应。

四、设备节点:通过mknod在/dev子目录下建立MTD字符设备节点(主设备号为90)和MTD块设备节点(主设备号为31),通过访问此设备节点即可访问MTD字符设备和块设备。

五、根文件系统:在Bootloader中将JFFS(或JFFS2)的文件系统映像jffs.image(或jffs2.img)烧到flash的某一个分区中,在/arch/arm/mach-your/arch.c文件的 your_fixup函数中将该分区作为根文件系统挂载。

参考资料:百度百科-MTD

求高手帮忙翻译一段基于OPENCV的运动目标检测的程序,详细翻译,老师会提问

这种运动目标检测的方法还是很经典的,下面写了一些注释仅作参考,希望对你有所帮助。

#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

#include time.h

#include math.h

#include ctype.h

#include stdio.h

#include string.h

const double MHI_DURATION = 0.1;//定义运动跟踪的最大时间

const double MAX_TIME_DELTA = 0.5;

const double MIN_TIME_DELTA = 0.05;

const int N = 3;//定义数组的维度为3

const int CONTOUR_MAX_AERA = 10;//定义的阈值

IplImage **buf = 0;

int last = 0;

IplImage *mhi = 0;

CvFilter filter = CV_GAUSSIAN_5x5;//高斯卷积滤波

CvConnectedComp *cur_comp, min_comp;//定义连通域操作的存储

CvConnectedComp comp;//定义连通域操作的存储

CvMemStorage *storage;//定义内存分配

CvPoint pt[4];//定义点的存储

/*****************************

*下面update_mhi函数输入img,输出识别结果dst,阈值diff_threshold

*/

void update_mhi( IplImage* img, IplImage* dst, int diff_threshold )

{

double timestamp = clock()/1.; //返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元

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 )

{

//分配内存操作:如果buf是空值,则分配存储空间

if( buf == 0 )

{

buf = (IplImage**)malloc(N*sizeof(buf[0]));//利用malloc动态分配内存

memset( buf, 0, N*sizeof(buf[0]));//作用是在一段内存块中填充某个给定的值,此处值为0

}

//创建通道为N=3,大小为size的图像存储

for( i = 0; i N; i++ )

{

cvReleaseImage( buf[i] );//释放buf

buf[i] = cvCreateImage( size, IPL_DEPTH_8U, 1 );//创建buf[i]

cvZero( buf[i] );//初始化为0

}

cvReleaseImage( mhi );//释放变量mhi

mhi = cvCreateImage( size, IPL_DEPTH_32F, 1 );//创建mhi,大小为size,深度为IPL_DEPTH_32F,1个通道

cvZero( mhi ); ///初始化为0

}

cvCvtColor( img, buf[last], CV_BGR2GRAY );//将RGB图像img转换成gray灰度图像buf

idx1 = last;//将last赋值到idx1

idx2 = (last + 1) % N; //计算(last + 1)除以N的余数

last = idx2;//将idx2赋值到last

silh = buf[idx2];//将buf[idx2]赋值到silh

//下面计算buf[idx1]与buf[idx2]差的绝对值,输出结果存入silh

cvAbsDiff( buf[idx1], buf[idx2], silh );

//下面对单通道数组silh应用固定阈值操作,阈值为30,阈值化类型为CV_THRESH_BINARY最大值为255

cvThreshold( silh, silh, 30, 255, CV_THRESH_BINARY );

//去掉影像(silh) 以更新运动历史图像为mhi,当前时间为timestamp,运动跟踪的最大时间为MHI_DURATION=0.1

cvUpdateMotionHistory( silh, mhi, timestamp, MHI_DURATION );

//下面对mhi进行线性变换操作,输出结果存入dst:dst(I)=mhi(I)*第二个参数 + 第三个参数

cvCvtScale( mhi, dst, 255./MHI_DURATION,

(MHI_DURATION - timestamp)*255./MHI_DURATION );

cvCvtScale( mhi, dst, 255./MHI_DURATION, 0 );

cvSmooth( dst, dst, CV_MEDIAN, 3, 0, 0, 0 );//对dst进行中值滤波

cvPyrDown( dst, pyr, 7 );//利用卷积滤波器对dst进行下采样

cvDilate( pyr, pyr, 0, 1 );//对图像pyr使用3*3长方形进行膨胀操作

cvPyrUp( pyr, dst, 7 );//利用卷积滤波器对dst进行上采样

stor = cvCreateMemStorage(0);//动态内存存储创建内存块

cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint) , stor);//创建存储结构

//函数cvFindContours为寻找图像dst的角点,数据存入cont中,其中包含角点的坐标值

cvFindContours( dst, stor, cont, sizeof(CvContour),

CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

for(;cont;cont = cont-h_next)

{

CvRect r = ((CvContour*)cont)-rect;//创建矩形区域

if(r.height * r.width CONTOUR_MAX_AERA)

{

//下面是在图像Img上绘制红色的矩形框,利用左上点和右下点

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);

}

}

cvReleaseMemStorage(stor);//释放内存

cvReleaseImage( pyr );//释放结构体

}

int _tmain(int argc, _TCHAR* argv[])

{

IplImage* motion = 0;

CvCapture* capture = 0;

capture = cvCaptureFromFile("D://Capture1.avi");//获取视频文件

if( capture )

cvNamedWindow( "视频分析", 1 );//创建窗口

{

for(;;)

{

IplImage* image;

if( !cvGrabFrame( capture ))//如果读取视频失败,则退出

break;

image = cvRetrieveFrame( capture );//获取图像

if( image )

{

if( !motion )

{

motion = cvCreateImage( cvSize(image-width,image-height), 8, 1 );

cvZero( motion );

motion-origin = image-origin;

}

}

update_mhi( image, motion, 60);//运动目标检测,阈值为60

cvShowImage( "视频分析", image );//在窗口中显示图像

if( cvWaitKey(10) = 0 )

break;

}

cvReleaseCapture( capture );//释放

cvDestroyWindow( "视频分析" );//释放窗口

}

return 0;

}

matlab怎样运动目标的检测

function vu = get_mask()//定义函数VU

bg = imread('tu\\131.jpg');//读入图片131.jpg

bg = rgb2gray(bg);//将图片转换为灰度图像

bg = im2bw(bg, graythresh(bg));//再转换为二值图,阈值是对灰度图像用最大类间方差法得到的

Img = imread('tu\\1.jpg');//读入图片1.JPG

I = rgb2gray(Img);//转换为灰度图

I = im2bw(I, graythresh(I));//转换为二值图

bw = I;//

L = bwlabel(I);//从黑背景甄别白块,返回和I相同大小的图像L

stats = regionprops(L, 'Area');//统计被标记白块的区域的总面积

Ar = cat(1, stats.Area);//按列连接矩阵

[mr, ind] = max(Ar);//找到Ar中那些最大值的索引位置,将他们放在向量ind中

I(L~=ind) = 0;//I中L与ind不相等的位置赋值为零

vu = imfill(I, 'holes');//将原图填充孔洞

运动目标检测——光流法与opencv代码实现

运动目标的检测的其主要目的是 获取目标对象的运动参数(位置、速度、加速度等)及运动轨迹 ,通过进一步分析处理,实现对目标行为更高层级上的理解。

运动目标检测技术目的是 从序列图像中将变化区域从背景图像中提取出来 ,常用于视频监视、图像压缩、三维重构、异常检测等。

运动目标检测主流方法有帧差法、背景差法、光流法等。光流法源于 仿生学 思想,更贴近于直觉,大量昆虫的视觉机理便是基于光流法。

二十世纪五十年代心理学家Gibson在他的著作“The Perception of Visual World”中首次提出了以心理学实验为基础的光流法基本概念,而直到八十年代才由Horn、Kanade、Lucash和Schunck创造性地将灰度与二维速度场相联系,引入光流约束方程的算法,对光流计算做了奠基性的工作。

光流(optical flow):由于目标对象或者摄像机的移动造成的图像对象在连续两帧图像中的移动。

小球在连续五帧运动构成的光流 小球在连续五帧运动构成的光流

通俗说,对于一个图片序列,把每张图像每个像素在连续帧之间的运动速度和方向( 某像素点在连续两帧上的位移矢量 )找出来就是光流场。

第t帧的时A点的位置是(x1, y1),第t+1帧时A点位置是(x2,y2),则像素点A的位移矢量:(ux, vy) = (x2, y2) - (x1,y1)

如何知道第t+1帧的时候A点的位置涉及到不同的光流计算方法,主要有四种:基于梯度的方法、基于匹配的方法、基于能量的方法、基于相位的方法。

光流法依赖于三个假设:

根据所形成的光流场中 二维矢量的疏密程度 ,光流法可分为稠密光流与稀疏光流。

基于区域匹配生成的稠密光流场 基于区域匹配生成的稠密光流场

稀疏光流只对有 明显特征的组点 (如角点)进行跟踪,计算开销小。

基于特征匹配发生成的稀疏光流场 基于特征匹配发生成的稀疏光流场

(1)calcOpticalFlowPyrLK

基于金字塔LK光流算法,计算某些点集的稀疏光流。

参考论文《Pyramidal Implementation of the Lucas Kanade Feature TrackerDescription of the algorithm》

(2)calcOpticalFlowFarneback

基于Gunnar Farneback 的算法计算稠密光流。

参考论文《Two-Frame Motion Estimation Based on PolynomialExpansion》

(3)CalcOpticalFlowBM

通过块匹配的方法来计算光流

(4)CalcOpticalFlowHS

基于Horn-Schunck 的算法计算稠密光流。

参考论文《Determining Optical Flow》

(5)calcOpticalFlowSF

论文《SimpleFlow: A Non-iterative, Sublinear Optical FlowAlgo》的实现

LK光流法效果 LK光流法效果

谁知道如何用matlab做动态背景下运动物体的检测

可靠,所以现在主要以手势/人脸识别为主;这是因为手和脸上面有比较独特的特征点。你说的滤波归根结底还是要找出具有灰度跳变的高频部分作为人体;这除非背景中除了人以外没有其他突出的物体;否则光凭滤波二值法检测人体是不太现实。

2 两张图片中人要是产生相对运动,检测起来就容易多了;利用帧间差分找到图像中灰度相差大的部分(你用的滤波也是一种手段);然后二值化区域连通;要是图像中没有其他移动物体计算连通区域的变动方向就是人的运动方向。

你可以去PUDN上搜搜相关的目标检测的代码;完全和你这个对应是不可能的。照你说的情况可以先建立起静态背景的模型(或者直接在没人的时候拍张);然后不断的与这个背景做差,原理和帧间差分一样。建议你先从典型的帧间差分例程开始下手(比如移动车辆的检测,这个比较多)。

你在二值化之后加上一个区域连通的步骤;即使用膨胀或者闭运算;这样你的轮廓就是连续的了;用matlab的话bwlabel可以统计连通区域里面像素的个数也就是人体面积大小。质心就是横竖坐标的平均值;取所有人体点的横竖坐标分别累加;除以坐标总数得到的x和y平均值;这个就是质心了

运动目标检测代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于运动目标检测技术研究、运动目标检测代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/33026.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载