#include "header.h"
intmain()
{const int sample_num = 10; //训练每类图片数量
const int class_num = 3; //训练类数3:石头剪刀布
const int image_cols = 30;const int image_rows = 30;stringName, Path;float trainingData[class_num * sample_num][image_cols * image_rows] = { { 0 } }; //每一行一个训练样本
float labels[class_num * sample_num][class_num] = { { 0 } }; //训练样本标签
cout<< "training Data.........\n";for (int i = 0; i < class_num; i++){int j = 0;
Path= getstring(i + 1) + "/" + "*.*";
HANDLE hFile;
LPCTSTR lp=StringToWchar(Path);
WIN32_FIND_DATA pNextInfo;
hFile= FindFirstFile(lp, &pNextInfo);if (hFile ==INVALID_HANDLE_VALUE){
cout<< "failed" <
exit(-1);//搜索失败
}
cout<< "folder name:" << i + 1 <
if (pNextInfo.cFileName[0] == ‘.‘)continue;
cout<< "file name" << WcharToChar(pNextInfo.cFileName) <
Mat srcImage= imread(getstring(i+1) + "/" +WcharToChar(pNextInfo.cFileName), CV_LOAD_IMAGE_GRAYSCALE);
Mat trainImage;//if (!srcImage.empty())cout << " done \n";//处理样本图像
resize(srcImage, trainImage, Size(image_cols, image_rows), (0, 0), (0, 0), CV_INTER_AREA);
Canny(trainImage, trainImage,150, 100, 3, false);for (int k = 0; 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~" <
for (int i = 0; i < class_num ; i++){for (int j = 0; j < sample_num; j++){for (int k = 0; k < class_num; k++){if (k == i)labels[i*sample_num + j][k] = 1;else labels[i*sample_num + j][k] = 0;
}
}
}//标签矩阵
Mat labelsMat(class_num*sample_num, class_num, CV_32FC1, labels);
cout<< "labelsMat done~" <
CvANN_MLP bp;
CvANN_MLP_TrainParamsparams;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, 10000, 0.0001);//设置网络层数
Mat layerSizes = (Mat_(1, 4) << image_rows*image_cols, int(image_rows*image_cols / 2),int(image_rows*image_cols / 2), class_num);
bp.create(layerSizes, CvANN_MLP::SIGMOID_SYM,1.0, 1.0);
cout<< "training...." <
bp.train(DataMat, labelsMat, Mat(), Mat(),params);
bp.save("detect_gesture.xml");
cout<< "done" <
cout << "testing...." <
Mat test= imread("test.jpg");
Mat temp;
resize(test, temp, Size(image_cols, image_rows), (0, 0), (0, 0), CV_INTER_AREA);
Canny(temp, temp,150, 100, 3, false);
Mat_sample(1, image_rows*image_cols);for (int i = 0; i
sample.at(0, i) = (float)temp.data[i];
}
Mat result;
bp.predict(sample, result);float* p = result.ptr(0);float max = -1, min = 0;int index = 0;for (int i = 0; i
{
cout<< (float)(*(p + i)) << " ";if (i == class_num - 1)
cout { 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) * 100) > 100 ? 100 : ((max - min) * 100)) < int computer = random(3); cout<< "computer‘s choice :" << choice[computer] < cout<< "You Lose T_T" << endl < }else cout << "You Win o * ̄▽ ̄*" << endl < system("pause"); waitKey(100);return 0; }