基于MATLAB的简单手势识别
匆匆在看完了MOOC的《数字图像处理》,为了巩固所学,做了一个简单的手势识别(只能识别手势1、2、3)!
0、安装硬件支持包软硬件安装
0.1、MATLAB R2021b安装
软件包下载地址微信公众号:小白课代表
一开始我是用的MATLAB R2018b,但是在根据B站视频《10分钟学会matlab实现cnn图像分类》学习的过程中,发现没有办法生成代码,所以换成了MATLAB R2021b。我的笔记本运行R2021b太卡了,每次打开R2021b都要5分钟,而且运行的时候也经常碰到问题,有时候没法编辑.m文件,有时候按F1没有反应,我太难了。
0.2、安装硬件支持包
一些经验:
1、工具包安装失败的解决方法:把防火墙、杀毒软件什么的都关了,然后重启MATLAB,多试几次就可以
2、摄像头画面值显示一个大红叉的解决方法:多重启MATLAB几次就可以3、报错:Unable to allocate memory for an incoming image frame due to insufficient free physical memory.
解决方法:C盘要留出10G以上的大小
1、查看支持包信息
%%
close all;
clear all;
clc;%%
disp(imaqhwinfo)%查看当前适配器%%
info = imaqhwinfo('winvideo')%查看该适配器下所有设备%%
disp(info.DeviceInfo)%通过DeviceInfo查看摄像头详细信息%%
disp(info.DeviceInfo.SupportedFormats)%SupportedFormats是该摄像头支持的图像色彩与尺寸%%
%解决错误:The device associated with device ID 1 is already in use.
clc; clear;
close all;
objects = imaqfind %find video input objects in memory
%%
stop(objects);
delete(objects) %delete a video input object from memory
2、获取截图(自己创建训练集)
%%
obj = videoinput('winvideo',1,'MJPG_640x480');
h = preview(obj);
start(obj)
tic%启动秒表计时器% 手势1保存的路径:'D:\gao\Program\MATLAB\第一学期\数字图像处理\手势\finger_1\original\';
file_root='D:\gao\Program\MATLAB\第一学期\数字图像处理\手势\';finger_num=1%手势表示的数值,也可以理解为标签
picture_num=40%每一种手势的截图个数
file_root=[file_root,'finger_',num2str(finger_num),'\original\'];for i=1:picture_numipause(1)%延迟1sframe = getsnapshot(obj); % 获取帧file_name=[file_root,'finger_',num2str(finger_num),'_',num2str(i),'.bmp'];imwrite(frame,file_name);%手势1的第一张截图的名称:finger_1_1.bmp
end
toc%从秒表读取已用时间
stop(obj);
delete(obj)
报错:
The device associated with device ID 1 is already in use.
解决错误:
%% clc; clear; close all; objects = imaqfind %find video input objects in memory %% stop(objects); delete(objects) %delete a video input object from memory
3、 图像预处理
%% 读入图片
close all;
clear all;
clc;quarter=16;%减采样倍数p_store=1;%指向存储的位置
input=zeros(30,40,20*3);%图片大小:30*40,图片个数:3*20
finger_num=3
picture_num=40
for p_finger_num=1:finger_numfile_root='D:\gao\Program\MATLAB\第一学期\数字图像处理\手势\';% 'D:\gao\Program\MATLAB\第一学期\数字图像处理\手势\finger_1\original\'file_root=[file_root,'finger_',num2str(p_finger_num),'\original\'];for p_picture_num=1:picture_num%'D:\gao\Program\MATLAB\第一学期\数字图像处理\手势\finger_1\original\finger_1_1.bmp'file_name=[file_root,'finger_',num2str(p_finger_num),'_',num2str(p_picture_num),'.bmp'];%I_rgb=imread(file_name); %用 imread 函数来读入图像,480*640*3 I_gray=rgb2gray(I_rgb);% 灰度,480*640 I_quarter=imresize(I_gray, 1/quarter);% 减采,30*40 T=graythresh(I_quarter);I_BW=im2bw(I_quarter,T); % 阈值分割 H=fspecial('average',[3,3]);%平滑滤波,创建预定义的2d过滤器I_filter=imfilter(I_BW,H);%I_gray I_edge=edge(I_filter); % 边缘提取 input(:,:,p_store)=I_edge;p_store=p_store+1;%指向下一个存储的位置end
end%% 随机查看输入图片是否正常
p=input(:,:,floor(rand*120));
figure('name','原始图片')
imshow(p); %用 imshow 函数来显示图像%% 输出
output=ones(1,finger_num*picture_num);
for p_finger_num=1:finger_numoutput(1, (1:picture_num)+(p_finger_num-1)*picture_num )=p_finger_num*ones(1,picture_num);
end%% 保存数据
save('data123_in30_40_out1_1.mat','input','output'); %将变量保存到当前文件夹中的文件
CSDN 上传图片取消自动加水印的方法
4、卷积神经网络
%% 装入数据
close all;
clearvars % clear all;
clc;
load('data123_in30_40_out1_1.mat')%% 读入训练数据和验证数据
XTrain =cat(3, input(:,:,1:30), input(:,:,41:70), input(:,:,81:110));%30*40*90
YTrain =cat(2, output(:,1:30), output(:,41:70), output(:,81:110))';%90*1
XValidation =cat(3, input(:,:,31:40), input(:,:,71:80), input(:,:,111:120));%30*40*30
YValidation =cat(2, output(:,31:40), output(:,71:80), output(:,111:120))';%30*1
YTrain = categorical(YTrain);
YValidation = categorical(YValidation);%%
XTrain=reshape(XTrain,[30,40 ,1,90]);
XValidation=reshape(XValidation,[30,40 ,1,30]);%% 创建层组
layers = [imageInputLayer([30 40])convolution2dLayer(5,16,'Padding','same')batchNormalizationLayerreluLayer('Name','relu_1')convolution2dLayer(3,32,'Padding','same','Stride',2)batchNormalizationLayerreluLayerconvolution2dLayer(3,32,'Padding','same')batchNormalizationLayerreluLayeradditionLayer(2,'Name','add')averagePooling2dLayer(2,'Stride',2)fullyConnectedLayer(3)softmaxLayerclassificationLayer];%% 定义skipConv
skipConv = convolution2dLayer(1,32,'Stride',2,'Name','skipConv');%% 连接skipConv
lgraph = connectLayers(lgraph,'relu_1','skipConv');
lgraph = connectLayers(lgraph,'skipConv','add/in2');
figure
plot(lgraph);%% 训练
options = trainingOptions('sgdm', ...'MaxEpochs',38, ...'Shuffle','every-epoch', ...'ValidationData',{XValidation,YValidation}, ...'ValidationFrequency',30, ...'Verbose',false, ...'Plots','training-progress');
net = trainNetwork(XTrain,YTrain,lgraph,options);%% 对验证图像进行分类并计算精度。这个网络非常准确。
YPredicted = classify(net,XValidation);
accuracy = mean(YPredicted == YValidation)%% 保存当前网络
save('data_CNN_Network.mat','net')
5、随机测试一张图片
%%
close all;
clear all;
clc;%% 读入图像
I_rgb=imread('finger_1_1.bmp');
figure('name','原始图片')
imshow(I_rgb);
%% 灰度
I_gray=rgb2gray(I_rgb);
figure('name','灰度图片')
imshow(I_gray);
%% 减采
quarter=16;%减采倍数
I_quarter=imresize(I_gray, 1/quarter);
figure('name','减采样图片')
imshow(I_quarter);
%% 阈值分割
figure('name','直方图')
imhist(I_quarter);
T=graythresh(I_quarter);
BW=im2bw(I_quarter,T);
figure('name','Otstu图片')
imshow(BW);
%% 平滑滤波
H=fspecial('average',[3,3]);%平滑滤波,创建预定义的2d过滤器
I_filter=imfilter(BW,H);%I_gray
figure('name','滤波图片')
imshow(I_filter);
%% 边缘提取
I_edge=edge(I_filter);%30*40
figure('name','边缘图片')
imshow(I_edge);%% 分类
load('data_CNN_Network.mat')%加载训练好的CNN
% net(I_edge)
classify(net,I_edge)
6、实时检测
%%
%解决错误:The device associated with device ID 1 is already in use.
clc; clear;
close all;
objects = imaqfind %find video input objects in memory
if ~isempty(objects)stop(objects);delete(objects) %delete a video input object from memorydisp('not empty' )
elsedisp(' empty' )
end%%
close all;
clearvars ;
clc;load('data_CNN_Network.mat')
quarter=16
%利用getsnapshot(obj) 即可导出图像,若想连续导出可通过以下方式
obj = videoinput('winvideo',1,'MJPG_640x480');%(adaptorname,deviceID,format)
h = preview(obj);%stoppreview//closepreview//delete(obj)停止/关掉预览
cycles=10;%循环的参数start(obj)
tic%启动秒表计时器I_rgb=zeros(480,640,3,cycles);%用来存储原始截图
I_edge=zeros(30,40,cycles);%用来存储边缘化后的截图
result=zeros(1,cycles);
f1=figure('name','原始图片');
f2=figure('name','边缘处理');for i=1:cycles%ishandle(h)%测试h是否有效的图形或 Java 对象句柄ipause(1)%延迟disp('获取帧');i_rgb = getsnapshot(obj); % 获取帧i_gray=rgb2gray(i_rgb);% 灰度i_quarter=imresize(i_gray, 1/quarter);% 减采T=graythresh(i_quarter);I_BW=im2bw(i_quarter,T); % 阈值分割H=fspecial('average',[3,3]);%平滑滤波,创建预定义的2d过滤器i_filter=imfilter(I_BW,H);%I_grayi_edge=edge(i_filter); % 边缘提取result(i)=uint8(classify(net,i_edge));result(i)pause(1)%延迟figure(f1);subplot(ceil(cycles/3),3,i)%ceil——Round toward positive infinityimshow(i_rgb);title([num2str(i) ':' num2str(result(i))]);I_rgb(:,:,:,i) = i_rgb;% 存储原始截图figure(f2);subplot(ceil(cycles/3),3,i)imshow(i_edge);title([num2str(i) ':' num2str(result(i))]);I_edge(:,:,i) = i_edge;% 存储边缘截图endtoc%从秒表读取已用时间
stop(obj);
delete(obj)
运行结果:
注意:
若结果报错:Unable to allocate memory for an incoming image frame due to insufficient free physical memory.
我的解决方法:
方法1:关闭当前.m文件,再重新打开
方法2:关闭MATLAB,再重新打开
方法3:关闭电脑,再重新打
基于MATLAB卷积神经网络的简单手势识别-精简-机器学习文档类资源-CSDN下载内容概要:通过简单手势识别,带着读者做一遍软件安装、数据集采集、图像处理、神经网络训练、网络的测试、更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qq_35629563/86248802
基于MATLAB的简单手势识别(包含全部调试资源)https://download.csdn.net/download/qq_35629563/86248804
基于MATLAB的简单手势识别相关推荐
- matlab fdatool陷波器,基于MATLAB的简单50Hz数字陷波器.doc
基于MATLAB的简单50Hz数字陷波器 摘要:陷波器是一个二阶滤波器,它的幅度特性在ω=±ω0处为零,在其他频率上接近常数,是一个滤波单频干扰的滤波器.一般仪器都用50Hz的交流电源供电,因而信号中 ...
- 基于matlab的数字下变频器的设计与仿真应用,基于matlab的简单数字下变频器的设计...
一.课程设计问题的提出: 试设计一数字下变频器,并用matlab 仿真: 二.二.解决问题的原理.技术方案解决问题的原理.技术方案解决问题的原理.技术方案以及以及matlab 验证验证: :数字下变频 ...
- 基于MATLAB实现简单人工神经网络
资源下载地址:https://download.csdn.net/download/sheziqiong/85979688 资源下载地址:https://download.csdn.net/downl ...
- 基于matlab的简单的寻找波峰波谷处理方法
[plain] view plain copy clc; close all; clear; % 节点信息 data=[105.03 99.18 84.965 72.445 68.994 77.265 ...
- MATLAB基于BP神经网络的手势识别
MATLAB基于BP神经网络的手势识别 摘 要:给出了采用MATLAB来识别五个手指和手背的同心圆距离,并通过颜色肤色的方法来提取手势特征量,同时利用BP神经网络算法进行误差分析来实现手势识别的设计方 ...
- 用matlab编程简单电子琴,基于MATLAB的数字信号发生器及简易电子琴设计论文.doc...
基于MATLAB的数字信号发生器及简易电子琴设计论文 基于MATLAB的数字信号发生器及简易电子琴设计 摘 要 数字信号发生器是一种基于软硬件结合实现的函数波形产生仪器.在工程实践中需要检测和分析的各 ...
- matlab 简单算例,(简单算例)基于Matlab的电力系统潮流编程计算.pdf
(简单算例)基于Matlab的电力系统潮流编程计算 基于Matlab的电力系统潮流编程计算 口黄扬威吴喜春郭志峰张斯翔 (三峡大学电气与新能源学院湖北·宜昌443002) 摘要:通过介绍电力系统的实际 ...
- 基于MATLAB软件GUI界面的自制简单电子琴
基于MATLAB软件GUI界面的自制简单电子琴 概要: 本文基于MATLAB及其GUI界面设计了一个简单电子琴.利用MATLAB的GUI控件及相关算法,实现了一些简单的功能.这是作者大一暑期课程< ...
- 基于matlab simulink (Simple 6-Pulse HVDC Transmission System)简单六脉冲高压直流输电系统
基于matlab simulink (Simple 6-Pulse HVDC Transmission System)简单六脉冲高压直流输电系统,该例子显示了一个简单的500MW(250kv-2kv) ...
最新文章
- OpenCV在ARM上的移植
- 欧拉回路【洛谷习题】无序字母对
- MySQL数据库:索引的实现原理
- nodeJS中的异步编程
- Base64编码及其作用
- SPOJ NSUBSTR(后缀自动机)
- java判断对象已经被回收_Java中JVM判断对象已死的基本算法分析
- latex ref引用章节号
- Heroku第三方服务接入指南(二)
- 彻底解决pip下载pytorch慢的问题
- npm下载require
- 百度万年历接口实现和分析
- 看不见的大猩猩--读书笔记
- 剑指offer_3 -- 构建乘积数组
- 小米运动app关联支付宝
- [创业-23]:财务报表 - 损益表(利润表)
- 如何在iOS 6 时代的App Store中推广
- Netbackup 8.1 许可证
- Weka安装及简单应用
- 创维E900V21E机顶盒刷机避坑
热门文章
- kakaotalk Id别人突然搜索不到,加入开放聊天室被封 KakaoTalk 被封 Kakaotalk临时禁用Kakao被团队临时禁用 kakaoTalk无法连接服务器
- 对于电子签名、CA、证书的理解
- SpringBoot部署应用到本地k8s
- 解决IE6兼容性问题常见方法
- 李开复给中国大学生的第一封信——从诚信谈起
- 企业实现统一身份认证的作用和好处有哪些?(图文并茂)
- 【Web前端HTML5CSS3】——CSS语法与选择器(超级全面)
- C#正则匹配(提取字符串中的数字)及C#“四舍五入”
- 【人体骨骼点】gt构建
- 登月源码开源登顶GitHub No.1!接而又被中国程序员“玩坏”了