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. 支持向量机 (SVM)分类器原理分析与基本应用

    前言 支持向量机,也即SVM,号称分类算法,甚至机器学习界老大哥.其理论优美,发展相对完善,是非常受到推崇的算法. 本文将讲解的SVM基于一种最流行的实现 - 序列最小优化,也即SMO. 另外还将讲解 ...

  2. jmeter 中的 Beanshell 使用

    一.操作变量:通过使内置对象vars可以对变量进行存取操作 a) vars.get("name"):从jmeter中获得变量值 b) vars.put("key" ...

  3. ready和onload的区别

    $(document).ready()和window.onload在表面上看都是页面加载时我们就去执行一个函数或动作,但是在具体的细节上$(document) ready()和window onloa ...

  4. 此博客主人已搬家访问新家地址:http://write.blog.csdn.net/postlist

    此博客主人已搬家访问新家地址:http://write.blog.csdn.net/postlist

  5. IOS Table中Cell的重用reuse机制分析

    IOS Table中Cell的重用reuse机制分析 技术交流新QQ群:414971585 创建UITableViewController子类的实例后,IDE生成的代码中有如下段落: - (UITab ...

  6. dependency of static library

    一直以来都有一个误区,认为静态库就一定是不含任何依赖的,动态库是含的.这个印象是因为在我们程序中,包含静态库的地方,往往Build好之后直接就可以用,而含DLL的地方,则需要在build好之后的EXE ...

  7. UVA 101

    题意:四种操作把a和b所在的数字移动. lrj的思想很好.首先找到共同点.然后不必写四种操作.其次理解vector的方便. #include<iostream> #include<c ...

  8. 【我是老中医】codeblocks无法编译的问题解决方法

    前几天把codeblocks的文件夹移动到移动硬盘里面,结果发现从此以后代码不能编译了,当时没有注意,就改用vs写代码,发现真的不是很习惯,正好学妹也碰到这种问题问我怎么解决,然后就百度了一下. 我的 ...

  9. 浏览器与web客户端的HTTP交互过程

    未经许可谢绝以任何形式对本文内容进行转载! HTTP协议是常见的几种应用层协议之一,当我们用浏览器和web客户端进行交互时html页面等内容的传输都是依靠该协议完成的.值得注意的是,HTTP使用的是T ...

  10. 在windows平臺下使用cygwin獲取root用戶權限

    最近在使用cygwin時發現一個問題,當我要使用root用戶權限時,竟然創建不了root賬戶.最後在網上找了下後,暫時衹找到了通過更改當前用戶權限獲得root權限的方法,具體如下: 实际环境:win1 ...