使用ANN神经网络训练数据后进行手势识别。

#include "header.h"

int main()
{
const int sample_num = ; //训练每类图片数量
const int class_num = ; //训练类数3:石头剪刀布
const int image_cols = ;
const int image_rows = ;
string Name, Path; float trainingData[class_num * sample_num][image_cols * image_rows] = { { } }; //每一行一个训练样本
float labels[class_num * sample_num][class_num] = { { } }; //训练样本标签 cout << "training Data.........\n";
for (int i = ; i < class_num; i++){ int j = ;
Path = getstring(i + ) + "/" + "*.*"; HANDLE hFile;
LPCTSTR lp = StringToWchar(Path);
WIN32_FIND_DATA pNextInfo;
hFile = FindFirstFile(lp, &pNextInfo);
if (hFile == INVALID_HANDLE_VALUE){
cout << "failed" << endl;
exit(-);//搜索失败
}
cout << "folder name:" << i + << endl; do{
//必须加这句,不然会加载.和..的文件而加载不了图片,
if (pNextInfo.cFileName[] == '.')continue; cout << "file name" << WcharToChar(pNextInfo.cFileName) << endl;
Mat srcImage = imread(getstring(i+) + "/" + WcharToChar(pNextInfo.cFileName), CV_LOAD_IMAGE_GRAYSCALE);
Mat trainImage; //if (!srcImage.empty())cout << " done \n";
//处理样本图像
resize(srcImage, trainImage, Size(image_cols, image_rows), (, ), (, ), CV_INTER_AREA);
Canny(trainImage, trainImage, , , , false);
for (int k = ; k < image_rows * image_cols; k++){
//cout << "矩阵 k-- " << k << " j--" << j << " i--" << i << endl;
trainingData[i*sample_num + j][k] = (float)trainImage.data[k]; }
j++;
} while (FindNextFile(hFile, &pNextInfo));
} // 训练好的矩阵
Mat DataMat(class_num*sample_num, image_rows*image_cols, CV_32FC1, trainingData);
cout << "DataMat done~" << endl; // 初始化标签
// 0-石头 1-剪刀 2-布
for (int i = ; i < class_num ; i++){
for (int j = ; j < sample_num; j++){
for (int k = ; k < class_num; k++){
if (k == i)labels[i*sample_num + j][k] = ;
else labels[i*sample_num + j][k] = ;
}
}
} // 标签矩阵
Mat labelsMat(class_num*sample_num, class_num, CV_32FC1, labels);
cout << "labelsMat done~" << endl; //训练代码
CvANN_MLP bp;
CvANN_MLP_TrainParams params;
params.train_method = CvANN_MLP_TrainParams::BACKPROP;
params.bp_dw_scale = 0.001;
params.bp_moment_scale = 0.1;
//cvTermCriteria 迭代终止规则
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, , 0.0001); //设置网络层数
Mat layerSizes = (Mat_<int>(, ) << image_rows*image_cols, int(image_rows*image_cols / ),
int(image_rows*image_cols / ), class_num);
bp.create(layerSizes, CvANN_MLP::SIGMOID_SYM, 1.0, 1.0);
cout << "training...." << endl;
bp.train(DataMat, labelsMat, Mat(), Mat(), params); bp.save("detect_gesture.xml");
cout << "done" << endl; //测试神经网络
cout << "testing...." << endl; Mat test = imread("test.jpg");
Mat temp;
resize(test, temp, Size(image_cols, image_rows), (, ), (, ), CV_INTER_AREA);
Canny(temp, temp, , , , false);
Mat_<float>sample(, image_rows*image_cols);
for (int i = ; i<image_rows*image_cols; ++i){
sample.at<float>(, i) = (float)temp.data[i];
} Mat result;
bp.predict(sample, result); float* p = result.ptr<float>();
float max = -, min = ;
int index = ;
for (int i = ; i<class_num; i++)
{
cout << (float)(*(p + i)) << " ";
if (i == class_num - )
cout << endl;
if ((float)(*(p + i))>max)
{
min = max;
max = (float)(*(p + i));
index = i;
}
else
{
if (min < (float)(*(p + i)))
min = (float)(*(p + i));
}
}
cout << "Your choice :" << choice[index] << endl << "识别率:"
<< (((max - min) * ) > ? : ((max - min) * )) << endl; //石头剪刀布——游戏开局~
int computer = random();
cout << "computer's choice :" << choice[computer] << endl;
if (computer == index) cout << "A Draw -_- " << endl << endl;
else if ((computer < index && (index - computer == )) || (computer == && index == )){
cout << "You Lose T_T " << endl << endl;
}
else cout << "You Win o * ̄▽ ̄* " << endl << endl; system("pause");
waitKey();
return ;
}

运行一次后,不用每次都训练数据,直接加载第一次保存的 "detect_gesture.xml"即可

CvANN_MLP bp;
CvANN_MLP_TrainParams params;
bp.load("detect_gesture.xml");

PS:

//CvTermCriteria()
//迭代算法的终止准则
#define CV_TERMCRIT_ITER 1
#define CV_TERMCRIT_NUMBER CV_TERMCRIT_ITER
#define CV_TERMCRIT_EPS 2 typedef struct CvTermCriteria
{
int type; // CV_TERMCRIT_ITER 和CV_TERMCRIT_EPS二值之一,或者二者的组合
int max_iter; // 最大迭代次数
double epsilon; // 结果的精确性
}
CvTermCriteria;
// 构造函数
inline CvTermCriteria cvTermCriteria( int type, int max_iter, double epsilon );
// 在满足max_iter和epsilon的条件下检查终止准则并将其转换使得type=CV_TERMCRIT_ITER+CV_TERMCRIT_EPS
CvTermCriteria cvCheckTermCriteria( CvTermCriteria criteria, double default_eps, int default_max_iters );

文件查找相关

OpenCV——手势识别的更多相关文章

  1. opencv 手势识别

    我使用OpenCV2.4.4的windows版本+Qt4.8.3+VS2010的编译器做了一个手势识别的小程序. 本程序主要使到了Opencv的特征训练库和最基本的图像处理的知识,包括肤色检测等等. ...

  2. [手势识别] CNN + OpenCV 手势识别记录

    这几天没事,想着再学点一些视觉识别方向的东西,因为之前做了验证码识别,有了机器学习的信心,因此这次打算做个手势识别,参考了很多网上的图像处理方式,中间也遇到了很多问题,最终算是做出来了吧. 1.训练集 ...

  3. 手势识别控制pygame精灵

    步骤: 编写简易pygame精灵游戏(只实现键盘上下左右控制) 解决opencv手势识别核心问题 上述2部分对接上 pygame部分我们只加载个背景,然后里面放1只乌龟精灵,用键盘的上下左右键来控制, ...

  4. OpenCV——写手势识别碰到的各种错误

    最近写opencv的手势识别时,真的碰到了好多好多程序运行时的错误. 比如: 位置冲突: findcontours函数的使用错误: 各种符号的加载错误: 这种符号加载的错误,一般用网上各种方法就可以解 ...

  5. 模式识别开发之项目---基于opencv的手势识别

    我使用OpenCV2.4.4的windows版本+Qt4.8.3+VS2010的编译器做了一个手势识别的小程序. 本程序主要使到了Opencv的特征训练库和最基本的图像处理的知识,包括肤色检测等等. ...

  6. Python C++ OpenCV TensorFlow手势识别(1-10) 毕设 定制开发

    Python C++ OpenCV TensorFlow手势识别(1-10) 毕设 支持定制开发 (MFC,QT, PyQt5界面,视频摄像头识别) QQ: 3252314061 效果如下:

  7. 开源项目(4-2)手势识别-Keras/Theano/OpenCV实现的CNN手势识别

    https://github.com/asingh33/CNNGestureRecognizer 我提供了两种捕获模式: 二进制模式:在这里我首先将图像转换为灰度,然后应用高斯模糊效果和自适应阈值滤波 ...

  8. [OpenCV] Samples 13: opencv_version

    cv::CommandLineParser的使用. I suppose CommandLineParser::has("something") should be true whe ...

  9. opencv 61篇

    (一)--安装配置.第一个程序 标签: imagebuildincludeinputpathcmd 2011-10-21 16:16 41132人阅读 评论(50) 收藏 举报  分类: OpenCV ...

随机推荐

  1. Backbone的id

    id 在model.attributes中,需要用户自行定义,可不定义,获取方法:model.get('id') cid collection中每个model都有的属性,由backbone自动生成,获 ...

  2. PHP优化的总结

    今天看了下PHPBB的相关规范,觉得有很多值得学习之处. 以下就几点PHP的优化做下总结: 1.in_array的用法 避免在大的数组上使用 in_array(),同时避免在循环中对包含20个以上元素 ...

  3. 关于vs2013error C4996: 'strcmpi': The POSIX name for this item is deprecated.的错误解决办法!

    1.出现如下错误(如图1) 2.解决办法(如图2)在头文件处添加#pragma warning(disable: 4996)

  4. 字符串处理(正则表达式、NSScanner扫描、CoreParse解析器)-备用

    搜索 在一个字符串中搜索子字符串 最灵活的方法 1 - (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptio ...

  5. ubuntu apache svn 参考

    Ubuntu下Subversion服务器的安装配置     本文涉及的范围 要通过 HTTP 协议访问 Subversion 文件仓库,需要安装并配置好 Web 服务器.Apache2 被证实可以很好 ...

  6. Spark集群模式概述

    作者:foreyou出处:http://www.foreyou.net/2015/06/22/spark-cluster-mode-overview/声明:本文采用以下协议进行授权: 署名-非商用|C ...

  7. VC++中的类的内存分布(上)

    0.序 目前正在学习C++中,对于C++的类及其类的实现原理也挺感兴趣.于是打算通过观察类在内存中的分布更好地理解类的实现.因为其实类的分布是由编译器决定的,而本次试验使用的编译器为VS2015 RC ...

  8. 20个最强的基于浏览器的在线代码编辑器 - OPEN资讯

    20个最强的基于浏览器的在线代码编辑器 - OPEN资讯 20个最强的基于浏览器的在线代码编辑器

  9. 【每天一个Linux命令】19. 创建文件夹目录命令mkdir

    命令用途 mkdir 命令用来创建指定的名称的目录 使用说明 1.  创建目录的用户在当前目录中具有写权限 2. 指定的目录名不能是当前目录中已有的目录. 命令实例 0. 帮助文件 bixiaopen ...

  10. oracle10.2 dblink impd 同库不同用户复制数据

    同库不同用户复制数据 1.授权用户导入表权限; SQL> grant exp_full_database to system; SQL> commit; 2.创建dblink; SQL&g ...