沈阳工业大学手掌中指检测matlab程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

function varargout = test1(varargin)
% TEST1 MATLAB code for test1.fig
% TEST1, by itself, creates a new TEST1 or raises the existing
% singleton*.
%
% H = TEST1 returns the handle to a new TEST1 or the handle to
% the existing singleton*.
%
% TEST1('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in TEST1.M with the given input arguments. %
% TEST1('Property','Value',...) creates a new TEST1 or raises the
% existing singleton*. Starting from the left, property value pairs are % applied to the GUI before test1_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application % stop. All inputs are passed to test1_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help test1
% Last Modified by GUIDE v2.5 06-Jul-2015 14:40:02
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @test1_OpeningFcn, ...
'gui_OutputFcn', @test1_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before test1 is made visible.
function test1_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to test1 (see VARARGIN)
% Choose default command line output for test1
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes test1 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line. function varargout = test1_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;(从这以上,都是创建fig文件后自动生成的语句)给读入的视频流设成全局变量
global vid;
vid=videoinput('winvideo',1);
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
摄像头读取
imaqhwinfo('winvideo');查询winvideo具体参数
global vid;
usbVidRes=get(vid, 'videoResolution');
nBands=get(vid, 'NumberOfBands');
axes(handles.axes1);%在axes1中显示视频流
hImage=imshow(zeros(usbVidRes(2), usbVidRes(1), nBands));
preview(vid, hImage);
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
截取一帧图像
global vid;
f=getsnapshot(vid);%截取一帧保存在f中
set(gcbf,'UserData',f);%把f保存在userdata空间中并命名为gcbf
imwrite(f, 'D:\camera1.jpg');%将图片保存在D盘
axes(handles.axes2);%在axes2中显示截取的图片
imshow(f);
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
梯度计算
I=get(gcbf,'UserData');%从userdata空间中读取gcbf并赋给I
I=double(I);%将整型图片转换为浮点型
[Gx,Gy]=gradient(I);%分别计算x方向和y方向的梯度
G=sqrt(Gx.*Gx+Gy.*Gy)/255;%计算每个点的梯度值,产生梯度图G
I2=rgb2gray(G);%将梯度图G转换为灰度图
I2(I2<5/255)=0;%设定阈值为5/255,即当梯度小于5/255时,视为非边缘,显示黑色
I2(I2>=5/255)=1;%当梯度大于5/255是,视为边缘,显示白色
膨胀与腐蚀
BW2=bwmorph(I2,'clean');%清洁工作
BW2=bwmorph(BW2, 'dilate');%膨胀工作
BW2=bwmorph(BW2, 'erode');%腐蚀工作
%BW2=edge(BW2,'canny');
手部填充
[rows,cols]=size(BW2);%记录图片的长和宽
BW2(:,1)=1;%left set 1
BW2(:,cols)=1;%right set 1
BW2(rows,:)=1;%bottom set 1
imwrite(BW2, 'D:\im2.jpg');%保存图片用于观察
BW3=imfill(BW2, 'holes');
BW3(:,1)=0;
BW3(:,cols)=0;%right set 1
BW3(rows-1,:)=0;%bottom set 1
BW3(rows,:)=0;%bottom set 1
%BW3=bwmorph(BW3,'clean');
%BW3=bwmorph(BW3,'spur');
BW3=bwareaopen(BW3,32);%去除图中面积小于32的区域,减少噪声点
imwrite(I2, 'D:\im1.jpg');
imwrite(BW3, 'D:\im3.jpg');
轮廓精提取
set(gcbf,'UserData',BW3);
BW3=edge(BW3,'canny');%用canny算子进行边缘检测
imwrite(BW3, 'D:\im4.jpg');
axes(handles.axes3);%将轮廓显示在axes3中
imshow(BW3);
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
重心定位(手部重心坐标即为二值图中所有值为1的点的坐标值之和,除以值为1的点的个数。

)BW3=get(gcbf,'UserData');
[rows,cols]=size(BW3);
x=ones(rows,1)*[1:cols];%m行全1矩阵与m列全1矩阵相乘,得到m阶全1方阵
y=[1:rows]'*ones(1,cols);
area=sum(sum(BW3));%对矩阵BW3按行求和,得到一个矩阵,再对这个矩阵求和,得到BW3所有元素之和
meanx=sum(sum(BW3.*x))/area;%BW3矩阵与x矩阵相乘得到的矩阵的所有元素之和除以手部点的个数,即为重心点的横坐标
meany=sum(sum(BW3.*y))/area; %BW3矩阵与y矩阵相乘得到的矩阵的所有元素之和除以手部点的个数,即为重心点的纵坐标
mx=int32(meanx);
my=int32(meany);%整型(小数变整数)
寻找最远点
maxdi=0;
for i=1:rows
for j=1:cols
if BW3(i,j)==1
dist=(i-my)^2+(j-mx)^2;
if dist>maxdi
maxdi=dist;
maxx=i;
maxy=j;
end
end
end
end
中指位置标示
BW3=edge(BW3,'canny');
BW3(:,maxy)=1;%另中指指尖位置所在列全为1,即一条白线
BW3(maxx,:)=1;%另中指指尖位置所在行全为1,即一条白线
axes(handles.axes4);
imshow(BW3);
中指坐标显示
set(handles.text1, 'String',maxy);%把maxy的值赋给text1文本框
set(handles.text3, 'String',maxx);%把maxy的值赋给text3文本框。

相关文档
最新文档