OpenCV——ジェスチャー認識
18974 ワード
ANNニューラルネットワークを用いてデータを訓練した後,ジェスチャー認識を行った.
1回実行後、毎回データを訓練することなく、最初に保存した「detect_gesture.xml」を直接ロードすればよい
PS:
ファイル検索関連
#include "header.h"
int main()
{
const int sample_num = 10; //
const int class_num = 3; // 3:
const int image_cols = 30;
const int image_rows = 30;
string Name, Path;
float trainingData[class_num * sample_num][image_cols * image_rows] = { { 0 } }; //
float labels[class_num * sample_num][class_num] = { { 0 } }; //
cout << "training Data.........
";
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" << endl;
exit(-1);//
}
cout << "folder name:" << i + 1 << endl;
do{
// , . .. ,
if (pNextInfo.cFileName[0] == '.')continue;
cout << "file name" << WcharToChar(pNextInfo.cFileName) << endl;
Mat srcImage = imread(getstring(i+1) + "/" + WcharToChar(pNextInfo.cFileName), CV_LOAD_IMAGE_GRAYSCALE);
Mat trainImage;
//if (!srcImage.empty())cout << " done
";
//
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~" << endl;
//
// 0- 1- 2-
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~" << 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, 10000, 0.0001);
//
Mat layerSizes = (Mat_<int>(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...." << 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), (0, 0), (0, 0), CV_INTER_AREA);
Canny(temp, temp, 150, 100, 3, false);
Mat_<float>sample(1, image_rows*image_cols);
for (int i = 0; ii){
sample.at<float>(0, i) = (float)temp.data[i];
}
Mat result;
bp.predict(sample, result);
float* p = result.ptr<float>(0);
float max = -1, min = 0;
int index = 0;
for (int i = 0; i)
{
cout << (float)(*(p + i)) << " ";
if (i == class_num - 1)
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) * 100) > 100 ? 100 : ((max - min) * 100)) << endl;
// —— ~
int computer = random(3);
cout << "computer's choice :" << choice[computer] << endl;
if (computer == index) cout << "A Draw -_- " << endl << endl;
else if ((computer < index && (index - computer == 1)) || (computer == 2 && index == 0)){
cout << "You Lose T_T " << endl << endl;
}
else cout << "You Win o * ̄▽ ̄* " << endl << endl;
system("pause");
waitKey(100);
return 0;
}
1回実行後、毎回データを訓練することなく、最初に保存した「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 );
ファイル検索関連