⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rljc.m

📁 基于图形识别的疲劳监测系统的第一步:人脸监测系统程序设计
💻 M
字号:
function rljc
x=imread('001.jpg');         % 读入图片
imshow(x)                    % 显示该图片

r=x(:,:,1);                  % 色彩补偿开始
g=x(:,:,2);
b=x(:,:,3);
rhe=sum(sum(r));             
ghe=sum(sum(g));
bhe=sum(sum(b));
k=r(:);
h=size(k);                   
z=h(1,1);                    % 提取照片像素个数
rping=rhe/z;
gping=ghe/z;
bping=bhe/z;
over=(rping+gping+bping)/3;
r1=(over/rping)*r;
g1=(over/gping)*g;
b1=(over/bping)*b;
rgb1(:,:,1)=r1;
rgb1(:,:,2)=g1;
rgb1(:,:,3)=b1;              
%figure:imshow(rgb1);         % 色彩补偿结束,显示补偿后照片

b=rgb1;
bb=rgb2ycbcr(b);             % 将RGB转换成Ycbcr
y=bb(:,:,1);                 
cb=bb(:,:,2);                
cr=bb(:,:,3);                % 分别提取Y,cb,cr
cb=double(cb);               % 将cb转成双精度
cr=double(cr);               % 将cr转成双精度

yp=sum(sum(y))/numel(y);     % 计算整个图片的Y的平均值
if((yp>=0)&(yp<110))         % 根据亮度,取适当的平均值和协方差
    cbp=116.6864;
    crp=141.2746;
    xfc=[76.0604,36.2955;36.2955,149.8167];
elseif((yp>=110)&(yp<200))
    cbp=109.4173;
    crp=149.2660;
    xfc=[120.3091,49.0511;49.0511,146.9649];
elseif((yp>=200)&(yp<255))
    cbp=122.6045;
    crp=132.7378;
    xfc=[104.6496,68.8855;69.8856,126.7650];
end

mu1=[cbp,crp];               % 输入均值
sigma2=xfc;                  % 输入协方差矩阵 
xy=[cb(:),cr(:)];            % 产生网格数据 
p=mvnpdf(xy,mu1,sigma2);     % 做高斯变换
P=reshape(p,size(cb));       % 求取联合概率密度 
i=max(max(P));               % 取肤色概率矩阵中的最大值
j=255/i;
P=j*P;                       % 将最大值设定为255,其他依次分配
d=mat2gray(P);               % 将双精度矩阵转换成灰度图
%figure:imshow(d);            % 显示灰度图像

level=graythresh(d);         % 用大津法设定二值图像的阈值
bw=im2bw(d,level);           % 将灰度图转换成二值图
%figure:imshow(bw);           % 显示二值图
se=strel('disk',2);
bw1=imopen(bw,se);           % 开运算滤波
bw2=imclose(bw1,se);         % 闭运算滤波
bw3=bwfill(bw2,'holes');     % 种子区域填充
%figure:imshow(bw);           % 显示肤色分割后的图像
bw4=bwperim(bw3);            % 轮廓提取
%figure:imshow(bw4);

label=bwlabel(bw3);          % 标注图像
area_num=regionprops(label,'Area'); 
len_area=length(area_num);   % 计算出连通域的个数
max_ind=0;
max_num=0;
area_bounding=regionprops(label,'BoundingBox');
t=[];
j=0;
for i=1:len_area 
    ration=area_num(i).Area;
if(ration>500)               % 第一步排除,如果面积小于500,则视为非人脸区域
j=j+1;
t(j)=i;
end
end
len_j=length(t); 
max_ind=t(1);
max_num=area_num(t(1)).Area;
for i=1:len_j 
if max_num<area_num(t(i)).Area % 取出最大的人脸候选区域
max_num=area_num(t(i)).Area;
max_ind=t(i);
end
end
location=[area_bounding(max_ind).BoundingBox]; %开始画图
rectangle('Position',[location(1),location(2),location(3),location(4)],'Curvature',[0,0],'LineWidth',2,'LineStyle','-')

% 人眼检测部分
x2=imcrop(x,[location(1),location(2),location(3),location(4)]);
figure:imshow(x2);







⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -