OpenCV——手势识别

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

#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.........\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" << 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 \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~" << 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; i<image_rows*image_cols; ++i){
        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<class_num; 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;
}

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 );

文件查找相关

时间: 2024-12-18 21:05:20

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

OpenCV手势识别-手掌特征提取

本文对OpenCV轮廓凸包检测以及参考代码两个部分进行合并.并加入自己的图像预处理,包括采集.去背景和二值化. 实现了手掌的特征点提取. 图1 原始图像 步骤1 图像采集 红外摄像头采集回来的图像.基本上背景全部被过路掉.省掉用RGB摄像头,接着还要HSV肤色检测的步骤 图2 去背景的二值化图像 步骤2 去背景.二值化 首先膨胀5个像素点,避免手指短截.接着选取最大轮廓,将最大轮廓重新画出来,过滤掉其它小轮廓,即背景噪声. 图3 近似多边形 步骤3 获取近似多边形 将二值化的图像转化成近似多边形

opencv 手势识别

原文地址: http://www.cnblogs.com/hebaichuanyeah/p/5014519.html 算法比较简单,根据皮肤特性检测手部,根据二值化的图像检测轮廓,然后感觉凸包和缺陷特性判断剪刀/石头/布. 代码: http://download.csdn.net/detail/u011641363/9321031 效果图

手势识别控制pygame精灵

步骤: 编写简易pygame精灵游戏(只实现键盘上下左右控制) 解决opencv手势识别核心问题 上述2部分对接上 pygame部分我们只加载个背景,然后里面放1只乌龟精灵,用键盘的上下左右键来控制,直接给出代码: 乌龟精灵代码(DemoSpirit.py): import pygame class DemoSpirit(pygame.sprite.Sprite): def __init__(self, target, screen_size, position): pygame.sprite.

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

我使用OpenCV2.4.4的windows版本+Qt4.8.3+VS2010的编译器做了一个手势识别的小程序. 本程序主要使到了Opencv的特征训练库和最基本的图像处理的知识,包括肤色检测等等. 废话不多,先看一下基本的界面设计,以及主要功能: 相信对于Qt有一些了解的人都不会对这个界面的设计感到陌生吧!(该死,该死!)我们向下走: 紧接着是Qt导入OPenCV2.4.4的库文件:(先看一下Qt的工程文件吧) [cpp] view plaincopyprint? #-------------

手势识别之--1:Opencv的环境搭建(法一)

准备 链接 opencv官网:http://opencv.org/ 快速开始    :http://opencv.org/quickstart.html Cmake      :http://www.cmake.org/cmake/resources/software.html(根据你的开发平台不同,构建生成相应的静态动态库的解决方案) numpy      :http://www.numpy.org/(非必需,python的一个科学计算库) Eigen       :http://eigen.

opencv训练分类器样本处理

分类器的训练以分为以下三部进行: 1. 样本的创建 2. 训练分类器 3. 利用训练好的分类器进行目标检测. 对检测物体要确定其属性:是否为绝对刚性的物体,也就是检测的目标是一个固定物体,没有变化(如特定公司的商标),这样的物体只要提供一份样本就可以进行训练. 但绝大数时候我们想进行训练的目标是非绝对刚性的物体,如对人的检测,包括人脸识别.手势识别. 样本:分为正样本---------负样本 正样本处理步骤: 所谓所谓正样本就是只包含检测目标的图片(最好背景一致),对于这我个人认为最好是检测目标

OpenCV、PCL;Xtion、kinect;OpenNI、kinect for windows SDK比较

一.对比介绍: 1. OpenCV:开源跨平台,OpenCV于1999年由Intel建立,如今由Willow Garage提供支持. 2. OpenNI:OpenNI组织创建于2010年11月.主要成员之一是PrimeSense公司(以色列一家公司,被苹果收购(2013年11月25),Kinect1核心芯片,华    硕Xtion).其他成员还有开发ROS的机器人公司Willow Garage,以及游戏公司Side-Kick.(因此OpenNI完全支持华硕,而不完全支持kinect2) 3. P

基于zedBoard的手势识别及桌面操控系统_项目论文

基于zedBoard的手势识别及桌面操控系统 山东大学信息学院集成电路 Sorin 目录 基于zedBoard的手势识别及桌面操控系统........................................................................ 1 综述..........................................................................................................

25、【opencv入门】轮廓查找与绘制(3)——凸包

一简介 1.凸包 凸包(Convex Hull)是一个计算机几何图形学中的概念, 简单来说, 给定二维平面点集, 凸包就是能够将最外层的点连接起来构成的凸多边形, 它能够包含点集中所有的点.物体的凸包检测场应用在物体识别.手势识别及边界检测等领域. A-H是被标出的凸包缺陷 2.寻找凸包---convexHull() 1 CV_EXPORTS_W void convexHull(InputArray points, OutputArray hull, bool clockwise=false,