Viola-Jones 人眼检测算法+meanshift跟踪算法

这次的代码是对视频中的人眼部分进行检测加跟踪,检测用的是matlab自带的人眼检测工具箱

下面是matlab官网介绍这个算法的一些东西:

http://cn.mathworks.com/help/vision/examples/face-detection-and-tracking-using-camshift.html?searchHighlight=Viola-Jones

http://cn.mathworks.com/help/vision/ref/vision.cascadeobjectdetector-class.html?searchHighlight=Viola-Jones

Viola-Jones是人眼、人脸检测非常常用的算法,使用的特征是haar-like特征,分类器是级联adaboost分类器;

Viola Jones Face Detector是Paul viola 和 Michael J Jones共同提出的一种人脸检测框架。它极大的提高了人脸检测的速度和准确率。

  • 速度提升方面:利用积分图像来提取图像特征值,所以非常快。同时,利用adaboost分类器的特征筛选特性,保留最有用特征,这也减少了检测时的运算复杂度。
  • 准确率提升方面:将adaboost分类器进行改造,变成级联adaboost分类器,提高了人脸检测的准确率(降低漏检率和误检率)。

这个算法的具体介绍可以参考链接:

http://www.cnblogs.com/hrlnw/archive/2013/10/23/3374707.html

然后,跟踪方面是最普通的meanshift跟踪算法

meanShift,均值漂移,在聚类、图像平滑、分割、跟踪等方面有着广泛的应用。meanShift这个概念最早是由Fukunage在1975年提出的,其最初的含义正如其名:偏移的均值向量;但随着理论的发展,meanShift的含义已经发生了很多变化。如今,我们说的meanShift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,然后以此为新的起始点,继续移动,直到满足一定的结束条件。

MeanShift算法正是属于核密度估计法,它不需要任何先验知识而完全依靠特征空间中样本点的计算其密度函数值。对于一组采样数据,直方图法通常把数据的值域分成若干相等的区间,数据按区间分成若干组,每组数据的个数与总参数个数的比率就是每个单元的概率值;核密度估计法的原理相似于直方图法,只是多了一个用于平滑数据的核函数。采用核函数估计法,在采样充分的情况下,能够渐进地收敛于任意的密度函数,即可以对服从任何分布的数据进行密度估计。这个算法的精髓,一张图片就可以解释,注意下图,即为均值漂移,非常形象。

图片及meanshift算法的进一步解释都可以参考链接:

http://blog.csdn.net/jinshengtao/article/details/30258833

下面贴出代码:

clc; clear all;close all;clf reset;
%%
%%%%%%%%%%%%%%%%%%%%%%%%--------人眼检测部分开始---------------------%%%%%%%%%%%%%%%%%%%%%% videoObj = VideoReader('eye.mp4');%读视频文件
nframes = get(videoObj, 'NumberOfFrames');%获取视频文件帧个数 img = read(videoObj, );%读取第1帧,用于人脸检测 Eye_Detect = vision.CascadeObjectDetector('EyePairBig');%使用 Viola-Jones 算法,人脸检测工具箱中的人眼部分 Eyes=step(Eye_Detect,img);%从第一张照片中检测出人眼,函数返回的是人眼的位置
hold on;
imshow(img);%显示第一张照片
for i = :size(Eyes,)
rectangle('Position',Eyes(i,:),'LineWidth',,'LineStyle','-','EdgeColor','r');%将上面人眼的位置,用一个矩形框框起来,显示
end title('Eyes Detection');%标注眼睛检测
hold off;
pause(0.000001)%暂停一小会,休息一下,马上回来 rect=Eyes(,:);%保存rect检测到的位置
temp=img(rect():rect()+rect(),rect():rect()+rect(),:);%将检测到的眼睛部分的图片提取出来
[a,b,c]=size(temp); %返回图片的维数
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算目标图像的权值矩阵%%%%%%%%%%%%%%%%%%%%%%%
y()=a/;
y()=b/;
tic_x=rect()+rect()/;
tic_y=rect()+rect()/;
m_wei=zeros(a,b);%权值矩阵
h=y()^+y()^ ;%带宽 for i=:a
for j=:b
dist=(i-y())^+(j-y())^;
m_wei(i,j)=-dist/h; %epanechnikov profile 核函数
end
end
C=/sum(sum(m_wei));%归一化系数 %计算目标权值直方图qu
%hist1=C*wei_hist(temp,m_wei,a,b);%target model
hist1=zeros(,);
for i=:a
for j=:b
%rgb颜色空间量化为16** bins
q_r=fix(double(temp(i,j,))/); %fix为趋近0取整函数,红色
q_g=fix(double(temp(i,j,))/); %绿色
q_b=fix(double(temp(i,j,))/); %蓝色
q_temp=q_r*+q_g*+q_b; %设置每个像素点红色、绿色、蓝色分量所占比重
hist1(q_temp+)= hist1(q_temp+)+m_wei(i,j); %计算直方图统计中每个像素点占的权重
end
end
hist1=hist1*C;
rect()=ceil(rect());
rect()=ceil(rect()); %%
%%%%%%%%%%%%%%%%%%%%%%%%%读取序列图像%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for l=:nframes
Im= read(videoObj, l);%读取第i帧
num=;
Y=[,]; %%%%%%%mean shift迭代
while((Y()^+Y()^>0.5)&num<) %迭代条件
num=num+;
temp1=imcrop(Im,rect);
%计算侯选区域直方图
%hist2=C*wei_hist(temp1,m_wei,a,b);%target candidates pu
hist2=zeros(,);
for i=:a
for j=:b
q_r=fix(double(temp1(i,j,))/);
q_g=fix(double(temp1(i,j,))/);
q_b=fix(double(temp1(i,j,))/);
q_temp1(i,j)=q_r*+q_g*+q_b;
hist2(q_temp1(i,j)+)= hist2(q_temp1(i,j)+)+m_wei(i,j);
end
end
hist2=hist2*C;
%figure();
%subplot(,,);
%plot(hist2);
% hold on; w=zeros(,);
for i=:
if(hist2(i)~=) %不等于
w(i)=sqrt(hist1(i)/hist2(i));
else
w(i)=;
end
end %变量初始化
sum_w=;
xw=[,];
for i=:a;
for j=:b
sum_w=sum_w+w(uint32(q_temp1(i,j))+);
xw=xw+w(uint32(q_temp1(i,j))+)*[i-y()-0.5,j-y()-0.5];
end
end
Y=xw/sum_w;
%中心点位置更新
rect()=rect()+Y();
rect()=rect()+Y();
end %%%跟踪轨迹矩阵%%%
tic_x=[tic_x;rect()+rect()/];
tic_y=[tic_y;rect()+rect()/]; v1=rect();
v2=rect();
v3=rect();
v4=rect();
%%
%%%显示跟踪结果%%%
%subplot(,,);
imshow(uint8(Im));
title('目标跟踪结果及其运动轨迹');
hold on;
plot([v1,v1+v3],[v2,v2],[v1,v1],[v2,v2+v4],[v1,v1+v3],[v2+v4,v2+v4],[v1+v3,v1+v3],[v2,v2+v4],'LineWidth',,'Color','r');
plot(tic_x,tic_y,'LineWidth',,'Color','b');
hold off;
pause(0.000001)
end

最后盗一张matlab官网效果图

meanShift

matlab工具箱之人眼检测+meanshift跟踪算法--人眼跟踪的更多相关文章

  1. 比微软kinect更强的视频跟踪算法--TLD跟踪算法介绍

    转自:http://blog.csdn.net/carson2005/article/details/7647500 TLD(Tracking-Learning-Detection)是英国萨里大学的一 ...

  2. TLD目标跟踪算法

    1. 简介 TLD目标跟踪算法是Tracking-Learning-Detection算法的简称.这个视频跟踪算法框架由英国萨里大学的一个捷克籍博士生Zdenek Kalal提出.TLD将传统的视频跟 ...

  3. TLD视觉跟踪算法(转)

    源:TLD视觉跟踪算法 TLD算法好牛逼一个,这里有个视频,是作者展示算法的效果,http://www.56.com/u83/v_NTk3Mzc1NTI.html.下面这个csdn博客里有人做的相关总 ...

  4. TLD(Tracking-Learning-Detection)一种目标跟踪算法

    原文:http://blog.csdn.net/mysniper11/article/details/8726649 视频介绍网址:http://www.cvchina.info/2011/04/05 ...

  5. TLD视觉跟踪算法

    TLD算法好牛逼一个,这里有个视频,是作者展示算法的效果,http://www.56.com/u83/v_NTk3Mzc1NTI.html.下面这个csdn博客里有人做的相关总结,感觉挺好的,收藏了! ...

  6. paper 140:TLD视觉跟踪算法(超棒)

    我是看了这样的一个视频:http://www.56.com/u83/v_NTk3Mzc1NTI.html 然后在准备针对TLD视觉跟踪算法来个小的总结. 以下博文转自:http://blog.csdn ...

  7. 挑战目标跟踪算法极限,SiamRPN系列算法解读

    商汤科技智能视频团队首次开源其目标跟踪研究平台 PySOT.PySOT 包含了商汤科技 SiamRPN 系列算法,以及刚被 CVPR2019 收录为 Oral 的 SiamRPN++.此篇文章将解读目 ...

  8. 基于MeanShift的目标跟踪算法及实现

    这次将介绍基于MeanShift的目标跟踪算法,首先谈谈简介,然后给出算法实现流程,最后实现了一个单目标跟踪的MeanShift算法[matlab/c两个版本] csdn贴公式比较烦,原谅我直接截图了 ...

  9. 目标跟踪算法meanshift优缺点

    原博主:http://blog.csdn.net/carson2005/article/details/7341051 meanShift算法用于视频目标跟踪时,采用目标的颜色直方图作为搜索特征,通过 ...

随机推荐

  1. C++学习笔记34:泛型编程拓展3

    输入流迭代器 #include <iostream> #include <iterator> #include <algorithm> #include <v ...

  2. 通过样式class 判断多个checkbox redio 是否都选中

    var count = "${count}"; for(var i=1;i<=count;i++){ var flag = false; if($("input[c ...

  3. memcache命中统计

    把memcache.php放在可以访问的位置,默认账户admin,密码admin 参考http://a.linji.cn/2011/12/memcachedphp.txt http://linji.c ...

  4. 【Cocos2d-x 3.x】 事件处理机制源码分析

    在游戏中,触摸是最基本的,必不可少的.Cocos2d-x 3.x中定义了一系列事件,同时也定义了负责监听这些事件的监听器,另外,cocos定义了事件分发类,用来将事件派发出去以便可以实现相应的事件. ...

  5. 第四篇T语言实例开发,自动加血

    游戏自动加血 基础知识复习 通过前面的学习了解以下内容: TC软件的基本使用 TC的基础语法 变量与常量 功能的使用 流程语句的使用 线程的基本使用 TC控件的基本使用 热键和按钮的事件功能 控件的数 ...

  6. linux yum软件管理

    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RP ...

  7. Enhanced Mitigation Experience Toolkit 软件安全性强化工具

    Enhanced Mitigation Experience Toolkit软件是微软为应对互联网中层出不穷的漏洞而推出的一款安全工具,可以在Window Update未获取到补丁前,对系统进行保护. ...

  8. linux下oracle启动问题

    需要注意的 1.由root用户切换到su oracle 不能启动sqlplus 由root用户切换到su -oracle 可以启动sqlplus 由oracle用户直接登陆也可以启动sqlplus命令 ...

  9. $.map和$.extend来复制数组(OA差旅)

    $.map:对数组的每个元素调用定义的回调函数并返回包含结果的数组. 对数组用指定的方法. //将原数组中每个元素加 4 转换为一个新数组. //jQuery 代码: $.map( [0,1,2], ...

  10. sql查询语句

    //查询表的字段名和字段类型select column_name,data_type from information_schema.columns where table_name = '表名' / ...