0
点赞
收藏
分享

微信扫一扫

【图像检测】手指指尖的图像采集与检测附matlab代码

1 简介

为克服传统二维彩色图像处理算法易受周围环境,光照变化,背景等因素的影响,提出利用计算机视觉信息,实现一种快速鲁棒的手势分割与指尖检测算法.首先,根据计算机视觉信息对非人体部分图像进行筛选,得到包含人手的人体图像;然后对当前得到的人体图像进行直方图分析,计算能够区分人手与非人手的阈值,并通过该阈值对人体图像进行分割得到人手图像;最后,对人手图像进行形态学处理,计算掌心位置,并提取手部轮廓,结合人手轮廓关键几何特征对指尖进行有效检测.实验表明,该方法能够实时,有效地对指尖进行检测.

2 部分代码

function indexXY=myConvexHull(x,y)
%构成四边形边界
n=length(x);
%最小最大的x和y坐标
ix=min(x);
iy=min(y);
ax=max(x);
ay=max(y);
%这段话其实没什么作用
%检测点集,删去内部点,留下可能构成最小凸包的点
test=(x>=ix | x<=ax | y>=iy | y<=ay);
index=1:n;
index=(index(test));
%可能构成最小凸包的点
x=x(test);
y=y(test);
%可能构成最小凸包的点数
n=length(x);
%按y值由小到大排序
[y,sindex] = sort(y);
x = x(sindex);
temp=zeros(n,1);
%共线问题,删去共线的点
%及假设几点是在同一条线上,则只取改线的两端点作为凸包点
colinear=false;
% if y(1)==y(2) || y(end)==y(end-1)
% i=1;
% while y(i)==y(i+1)
% i=i+1;
% end
% if i>2
% %计算求得输入点x坐标最小(如果x相等,则比较y是不是最小)的点,作为第一个点
% [x(1:i),xid]=sort(x(1:i),'descend');
% tempindex=sindex(xid);
% sindex(1:i)=tempindex;
% sindex(2:i-1)=[];
% y(2:i-1)=[];
% x(2:i-1)=[];
% end
% i=1;
% if x(1)>x(2)
% while y(end-i+1)==y(end-i)
% i=i+1;
% end
% if i>1
%
% colinear=true;
% [x(end-i+1:end),xid]=sort(x(end-i+1:end),'ascend');
% tempindex=sindex(end-i+1:end);
% sindex(end-i+1:end)=tempindex(xid);
%
% sindex(end-i+2:end-1)=[];
% x(end-i+2:end-1)=[];
% y(end-i+2:end-1)=[];
% end
%
% else
% while y(end-i+1)==y(end-i)
% i=i+1;
% end
% if i>1
%
% colinear=true;
% [x(end-i+1:end),xid]=sort(x(end-i+1:end),'descend');
% tempindex=sindex(end-i+1:end);
% sindex(end-i+1:end)=tempindex(xid);
%
% sindex(end-i+2:end-1)=[];
% x(end-i+2:end-1)=[];
% y(end-i+2:end-1)=[];
% end
% end
% n=length(x);
% end
%确定方向
%当x(1)>x(2),则方向为1
%否则为-1
if x(1)>x(2)
orientation=1;
else
orientation=-1;
end
%根据向量的叉乘公式求凸包,向量叉乘大于零为凸包
c=2;
i=2;
temp(1)=1;
temp(2)=2;
p1=temp(1);
p2=temp(2);
%从顶点顺时针扫描一遍
while i<=n-1
p3=i+1;
cp=orientation*((x(p1)-x(p2))*(y(p3)-y(p2))-(x(p3)-x(p2))*(y(p1)-y(p2)));
if cp>0
temp(c+1)=i+1;
p1=p2;
p2=p3;
c=c+1;
i=i+1;
else
if c>2
c=c-1;
p2=p1;
p1=temp(c-1);
else
temp(2)=i+1;
p2=i+1;
i=i+1;
end
end
end
p1=c-1;
p1=temp(p1);
p2=temp(c);
if colinear || p1==i-1;
i=i-1;
end
%从最低点顺时针扫描一遍
while i>1
p3=i-1;
cp=orientation*((x(p1)-x(p2))*(y(p3)-y(p2))-(x(p3)-x(p2))*(y(p1)-y(p2)));
if cp>0
temp(c+1)=i-1;
p1=p2;
p2=p3;
c=c+1;
i=i-1;
else
c=c-1;
p2=p1;
p1=temp(c-1);
end
end
indexXY=index(sindex(temp((1:c))))';
end

3 仿真结果

【图像检测】手指指尖的图像采集与检测附matlab代码_叉乘

【图像检测】手指指尖的图像采集与检测附matlab代码_叉乘_02

【图像检测】手指指尖的图像采集与检测附matlab代码_计算机视觉_03

4 参考文献

[1]高晨, 张亚军. 基于Kinect深度图像的指尖检测与手势识别[J]. 计算机系统应用, 2017, 26(4):6.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。


【图像检测】手指指尖的图像采集与检测附matlab代码_顺时针_04

举报

相关推荐

0 条评论