首页 > 编程语言 >Viola-Jones 人眼检测算法+meanshift跟踪算法

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

时间:2023-12-01 09:12:30浏览次数:51  
标签:Jones 人眼 temp 16 hist1 wei meanshift 算法 rect

clc; clear all;close all;clf reset;
%%
%%%%%%%%%%%%%%%%%%%%%%%%--------人眼检测部分开始---------------------%%%%%%%%%%%%%%%%%%%%%%

videoObj = VideoReader('eye.mp4');%读视频文件
nframes = get(videoObj, 'NumberOfFrames');%获取视频文件帧个数

img = read(videoObj, 1);%读取第1帧,用于人脸检测

Eye_Detect = vision.CascadeObjectDetector('EyePairBig');%使用 Viola-Jones 算法,人脸检测工具箱中的人眼部分

Eyes=step(Eye_Detect,img);%从第一张照片中检测出人眼,函数返回的是人眼的位置
hold on;
imshow(img);%显示第一张照片
for i = 1:size(Eyes,1)
 rectangle('Position',Eyes(i,:),'LineWidth',1,'LineStyle','-','EdgeColor','r');%将上面人眼的位置,用一个矩形框框起来,显示
end

title('Eyes Detection');%标注眼睛检测
hold off;
pause(0.000001)%暂停一小会,休息一下,马上回来

rect=Eyes(1,:);%保存rect检测到的位置
temp=img(rect(2):rect(2)+rect(4),rect(1):rect(1)+rect(3),:);%将检测到的眼睛部分的图片提取出来
[a,b,c]=size(temp); %返回图片的维数
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算目标图像的权值矩阵%%%%%%%%%%%%%%%%%%%%%%%
y(1)=a/2;
y(2)=b/2;
tic_x=rect(1)+rect(3)/2;
tic_y=rect(2)+rect(4)/2;
m_wei=zeros(a,b);%权值矩阵
h=y(1)^2+y(2)^2 ;%带宽


for i=1:a
    for j=1:b
        dist=(i-y(1))^2+(j-y(2))^2;
        m_wei(i,j)=1-dist/h; %epanechnikov profile 核函数
    end
end
C=1/sum(sum(m_wei));%归一化系数


%计算目标权值直方图qu
%hist1=C*wei_hist(temp,m_wei,a,b);%target model
hist1=zeros(1,4096);
for i=1:a
    for j=1:b
        %rgb颜色空间量化为16*16*16 bins
        q_r=fix(double(temp(i,j,1))/16);  %fix为趋近0取整函数,红色
        q_g=fix(double(temp(i,j,2))/16);  %绿色
        q_b=fix(double(temp(i,j,3))/16);  %蓝色
        q_temp=q_r*256+q_g*16+q_b;            %设置每个像素点红色、绿色、蓝色分量所占比重
        hist1(q_temp+1)= hist1(q_temp+1)+m_wei(i,j);    %计算直方图统计中每个像素点占的权重
    end
end
hist1=hist1*C;
rect(3)=ceil(rect(3));
rect(4)=ceil(rect(4));



%%
%%%%%%%%%%%%%%%%%%%%%%%%%读取序列图像%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



for l=1:nframes
    Im= read(videoObj, l);%读取第i帧
    num=0;
    Y=[2,2];
    
    
    %%%%%%%mean shift迭代
    while((Y(1)^2+Y(2)^2>0.5)&num<20)   %迭代条件
        num=num+1;
        temp1=imcrop(Im,rect);
        %计算侯选区域直方图
        %hist2=C*wei_hist(temp1,m_wei,a,b);%target candidates pu
        hist2=zeros(1,4096);
        for i=1:a
            for j=1:b
                q_r=fix(double(temp1(i,j,1))/16);
                q_g=fix(double(temp1(i,j,2))/16);
                q_b=fix(double(temp1(i,j,3))/16);
                q_temp1(i,j)=q_r*256+q_g*16+q_b;
                hist2(q_temp1(i,j)+1)= hist2(q_temp1(i,j)+1)+m_wei(i,j);
            end
        end
        hist2=hist2*C;
        %figure(2);
        %subplot(1,2,1);
        %plot(hist2);
       % hold on;
        
        w=zeros(1,4096);
        for i=1:4096
            if(hist2(i)~=0) %不等于
                w(i)=sqrt(hist1(i)/hist2(i));
            else
                w(i)=0;
            end
        end
        
        
        
        %变量初始化
        sum_w=0;
        xw=[0,0];
        for i=1:a;
            for j=1:b
                sum_w=sum_w+w(uint32(q_temp1(i,j))+1);
                xw=xw+w(uint32(q_temp1(i,j))+1)*[i-y(1)-0.5,j-y(2)-0.5];
            end
        end
        Y=xw/sum_w;
        %中心点位置更新
        rect(1)=rect(1)+Y(2);
        rect(2)=rect(2)+Y(1);
    end
    
    
    %%%跟踪轨迹矩阵%%%
    tic_x=[tic_x;rect(1)+rect(3)/2];
    tic_y=[tic_y;rect(2)+rect(4)/2];
    
    v1=rect(1);
    v2=rect(2);
    v3=rect(3);
    v4=rect(4);
    %%
    %%%显示跟踪结果%%%
    %subplot(1,2,2);
    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',2,'Color','r');
    plot(tic_x,tic_y,'LineWidth',2,'Color','b');
    hold off;
    pause(0.000001)
end

 

matlab官网效果图

 

 

 matlab的目标跟踪基于meanshift

meanshift结合颜色特征跟踪目标的程序(推荐)

标签:Jones,人眼,temp,16,hist1,wei,meanshift,算法,rect
From: https://www.cnblogs.com/bbhhh/p/17868866.html

相关文章

  • 位运算算法总结
    如何求n的二进制表示中第k位是几?1.先把第k位移到最后一位:n>>k2.看个位是几:x&1综合得到:n>>k&1返回的是n的二进制表示中第k位 题目链接:https://www.acwing.com/problem/content/803/题解:用到lowbit(x)=x&-x这个公式,它返回的是x的最后一个1以及后面的二进制数字......
  • 双指针算法总结
    双指针算法分为两类:第一类指向一个序列(更多的情况),第二类指向两个序列。基本的代码框架是:for(i=0,j=0;i<n;i++){while(j<i&&check(i,j))j++;//每道题目的具体逻辑}核心思想:运用单调性等性质,将O(n2)的算法优化到O(n)。种类:快排的划分、归......
  • 机器学习中的典型算法——卷积神经网络(CNN)
    1.机器学习的定位AI,是我们当今这个时代的热门话题,那AI到底是啥?通过翻译可知:人工智能,而人工智能的四个核心要素:-数据-算法-算力-场景然后机器学习是人工智能的一部分,机器学习里面又有新的特例:深度学习。通俗来说机器学习即使用机器去学习一部分数据,然后去预测新的数据所属......
  • 刚硬矩阵 (2) Walsh–Hadamard 变换的 "更快" 算法
    \(\newcommand{\sfT}{\mathsfT}\newcommand{\rank}{\operatorname{rank}}\)为了避免歧义,我们这里约定\[H=\begin{bmatrix}1&1\\1&-1\end{bmatrix},\]以及\(2^n\times2^n\)的Hadamard矩阵写作\(H^{\otimesn}\).令\(N=2^n\).低深度电路的算法这里我们......
  • 文心一言 VS 讯飞星火 VS chatgpt (146)-- 算法导论12.2 1题
    一、用go语言,假设一棵二叉搜索树中的结点在1到1000之间,现在想要查找数值为363的结点。下面序列中哪个不是查找过的序列?a.2,252,401,398,330,344,397,363。b.924,220,911,244,898,258,362,363。c.925,202,911,240,912,245,363。d.2,399,387,219,266,382,381,278,363。e.935,278,347,621,299,392,358,363。灵捷3......
  • 文心一言 VS 讯飞星火 VS chatgpt (146)-- 算法导论12.2 1题
    一、用go语言,假设一棵二叉搜索树中的结点在1到1000之间,现在想要查找数值为363的结点。下面序列中哪个不是查找过的序列?a.2,252,401,398,330,344,397,363。b.924,220,911,244,898,258,362,363。c.925,202,911,240,912,245,363。d.2,399,387,219,266,382,381,278,363。e.935,278,347,621,299,392,358,363。灵......
  • 基于FPGA的图像白平衡算法实现,包括tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览    2.算法运行软件版本vivado2019.2 matlab2022a 3.算法理论概述       FPGA(Field-ProgrammableGateArray)是一种可编程逻辑电路,可以通过编程实现各种算法,包括图像白平衡算法。图像白平衡算法是一种用于调整图像颜色温度的方法,......
  • 垃圾收集算法
    垃圾收集算法在Java内存运行时区域中,堆和方法区有着显著的不确定性:接口的多个实现类需要的内存可能不同方法执行中不同条件需要的内存空间也不同这部分内存的分配和回收是动态的。两个问题,回收谁、怎么回收回收谁——可回收垃圾(算法)当对象没有被任何地方引用时,显然是可回......
  • 基于MUSIC算法的二维超声波成像matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述      MUSIC(MultipleSignalClassification)算法是一种广泛应用于信号处理领域的算法,它可以用于估计信号的波达方向或频率。在超声波成像中,MUSIC算法可以用于提高图像的分辨率和降低......
  • 程序开发中常用的10种算法,你用过几种?
    当编写程序时,了解和使用不同的算法对解决问题至关重要。以下是C#中常用的10种算法,每个算法都伴随着示例代码和详细说明。1.冒泡排序(BubbleSort):冒泡排序是一种简单的比较排序算法,它多次遍历数组,将较大的元素逐渐浮动到数组的末尾。publicstaticvoidBubbleSort(int[]ar......