% 定义眼睛检测函数,返回左右眼的x和y坐标
function [XL, XR, YL, YR] = func_eye_pos(img)
% 初始化左右眼坐标默认值
XL = 100;
XR = 300;
YL = 50;
YR = 50;
% 复制输入图像
X = img;
X2 = X;
[y1,x1,z1] = size(X);% 获取图像尺寸
res=false;% 初始化是否缩放标志
if(y1>1300 || x1>1300)% 若图像尺寸超过1300x1300像素,则进行缩放
display('resized');
res = true;
X = imresize(X,.5);% 缩小图像至原来的一半
end
% 保存原始图像用于裁剪
forcrop=X;
X=imcomplement(X);% 图像反色处理
sup = X;% 保存反色后的图像
% 显示反色图像
imagesc(X)
% 将图像转换为HSV色彩空间并仅保留饱和度通道
X=rgb2hsv(X);
X=X(:,:,2);
% 自适应阈值二值化处理
BW = imbinarize(X, 'adaptive', 'Sensitivity', 0.900000, 'ForegroundPolarity', 'bright');
% 反色二值图
BW = imcomplement(BW);
radius = 4;% 定义结构元素用于形态学操作
decomposition = 0;
se = strel('disk', radius, decomposition);
BW = imopen(BW, se);% 开运算去除小物体
BW2= im2bw(BW);% 转换为二值图像
[B,L] = bwboundaries(BW);
% 分析区域属性
stats = regionprops(L,'Centroid','MajorAxisLength','MinorAxisLength','Area','BoundingBox','Orientation')
% 初始化存储变量
pos= [];
circles = [];
rad= [];
met=[];
bbnum=[];
for k = 1:size(B)% 遍历区域属性
imarea = y1*x1;
% 筛选符合条件的区域
if (stats(k).Orientation > -80) && (stats(k).Area > 100) && (stats(k).Area < (imarea*.40))
thisBB = stats(k).BoundingBox;
I2 = imcrop(sup,stats(k).BoundingBox);% 根据边界框裁剪图像
I2 = rgb2gray(I2);
rgbImage = cat(3, I2, I2, I2);% 重复彩色通道以适应后续处理
I = rgb2hsv(rgbImage);
% 定义HSV通道的阈值范围
V1min = 0.000;
V1max = 1.000;
V2min = 0.000;
V2max = 1.000;
V3min = 0.256;
V3max = 1.000;
% 应用阈值生成掩模
BW = (I(:,:,1) >= V1min ) & (I(:,:,1) <= V1max) & ...
(I(:,:,2) >= V2min ) & (I(:,:,2) <= V2max) & ...
(I(:,:,3) >= V3min ) & (I(:,:,3) <= V3max);
% 用掩模处理后的图像
maskedRGBImage = rgbImage;
% 将不在掩模内的像素置为0
maskedRGBImage(repmat(~BW,[1 1 3])) = 0;
% 绘制边界框
rectangle('Position', [thisBB(1),thisBB(2),thisBB(3),thisBB(4)],'EdgeColor','r','LineWidth',2 );
% 在掩模图像上寻找圆形
[centers,radii,metric]=imfindcircles(maskedRGBImage,[10 30],'Method','TwoStage','ObjectPolarity','bright','Sensitivity',.87,'EdgeThreshold',.03);
[centers2,radii2,metric2]=imfindcircles(maskedRGBImage,[30 80],'Method','TwoStage','ObjectPolarity','bright','Sensitivity',.87,'EdgeThreshold',.03);
% 合并两组圆形结果
if (~isempty(centers2))
centers= cat(1,centers,centers2);
radii=cat(1,radii,radii2);
metric=cat(1,metric,metric2);
end
% 处理找到的圆形
[m,n]=size(centers);
if m~=0 && m<6
count = m;
% 记录有效圆形的位置、半径等信息
circles = cat(1,circles,centers);
rad = cat(1,rad,radii);
met =cat(1,met,metric);
pos = cat(1,pos,[thisBB(1),thisBB(2),thisBB(3),thisBB(4)]);
end
end
end
% 继续处理找到的顶部圆形
center=[];
radius=[];
[m n] =size(pos);
% figure,imshow(sup);% 显示图像
for j=1:m
if(res == false)
main= sup;
% 裁剪图像
crop = imcrop(main,[pos(j,1),pos(j,2),pos(j,3),pos(j,4)]);
% 在裁剪图像上寻找圆形
[centers,radii,metric]=imfindcircles(crop,[5 20],'Method','TwoStage','ObjectPolarity','bright', 'Sensitivity',.96,'EdgeThreshold',.02 );
% 绘制已找到的圆形
viscircles([pos(j,1) + circles(j,1),(pos(j,2)+ circles(j,2))],rad(j));
[k na] = size(centers);
% 处理找到的圆形
if(~isempty(centers))
center = cat(1,center,[pos(j,1) + centers(1,1),(pos(j,2)+ centers(1,2))]);
radius= cat(1,radius,radii(1,1));
rectangle('Position', [pos(j,1),pos(j,2),pos(j,3),pos(j,4)],'EdgeColor','r','LineWidth',2 ); % 绘制边界框
end
else
main= sup;
rectangle('Position', [pos(j,1),pos(j,2),pos(j,3),pos(j,4)],'EdgeColor','r','LineWidth',2);% 绘制边界框
crop = imcrop(main,[pos(j,1),pos(j,2),pos(j,3),pos(j,4)]);
[centers,radii,metric]=imfindcircles(crop,[5 20],'Method','TwoStage','ObjectPolarity','bright', 'Sensitivity',.96,'EdgeThreshold',.02 );
viscircles([pos(j,1) + circles(j,1),(pos(j,2)+ circles(j,2))],rad(j));
[k na] = size(centers);
if(~isempty(centers))
center = cat(1,center,[pos(j,1)/.5 + centers(1,1),(pos(j,2)/.5+ centers(1,2))]);
radius= cat(1,radius,radii(1,1)/.5);
rectangle('Position', [pos(j,1),pos(j,2),pos(j,3),pos(j,4)],'EdgeColor','r','LineWidth',2 );
end
end
end
% 显示处理后的图像与圆形
% figure, imshow(X2)
% viscircles(center,radius);
% 计算眼睛间的相似度
[m n] = size(center);
max_corr= 0;
max_sim=0;
scalar=8;
if(res == true)
sup=X2;
sup= imcomplement(sup);% 反色处理
scalar=16;
end
for i= 1:m
temp = imcrop(sup,[center(i,1)-(radius(i)*2),center(i,2)-(radius(i)*2),(radius(i)*scalar),radius(i)*scalar]);
temp= rgb2gray(temp);
temp=flip(temp,2);
for o=i+1:m-1
cr= imcrop(sup,[center(o,1)-(radius(o)*2),center(o,2)-(radius(o)*2),(radius(i)*scalar),radius(i)*scalar]);
cr= imresize(cr,size(temp));
cr= rgb2gray(cr);
% 图像配准设置
[optimizer, metric] = imregconfig('multimodal')
optimizer.InitialRadius = 0.009;
optimizer.Epsilon = 1.5e-4;
optimizer.GrowthFactor = 1.01;
optimizer.MaximumIterations = 300;
tform = imregtform(cr,temp,'similarity',optimizer,metric);
cr = imwarp(cr,tform,'OutputView',imref2d(size(temp)));
% 计算模板匹配的相关系数
C1 = normxcorr2((temp),(cr));
% 更新最大相关系数和眼睛坐标
if(max(C1(:))>max_corr)
max_corr = max(C1(:));
XL=center(i,1);
YL=center(i,2);
XR=center(o,1);
YR=center(o,2);
end
end
end
end
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.版本:matlab2022A。 2.包含:程序,中文注释,参考文献,仿真操作步骤(使用windows media player播放)。 3.领域:人眼检测 4.仿真效果:仿真效果可以参考博客同名文章《基于机器视觉的人眼检测算法matlab仿真》 5.内容:基于机器视觉的人眼检测算法matlab仿真。基于机器视觉的人眼检测算法通常涉及多个步骤,包括图像预处理、特征提取、图像裁剪,二值化,目标检测等处理。 6.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
资源推荐
资源详情
资源评论
收起资源包目录
基于机器视觉的人眼检测算法matlab仿真.rar (6个子文件)
操作步骤.mp4 2.28MB
参考文献.rar 1.76MB
code
func_eye_pos.m 7KB
image
2.jpg 20KB
1.jpg 432KB
main.m 366B
共 6 条
- 1
资源评论
fpga和matlab
- 粉丝: 16w+
- 资源: 2563
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功