糖果派对官方网站_可以赌钱的糖果游戏_手机版
bb电子糖果派对VS二〇一〇 MFC的Tab控件怎样得以达成子框的变量和函数互用?

bb电子糖果派对VS二〇一〇 MFC的Tab控件怎样得以达成子框的变量和函数互用?

作者:网络编程    来源:未知    发布时间:2019-12-23 19:49    浏览量:

今昔有生机勃勃主对话框,CMyTab类,m_tab。有三个子对话框CTabPage1和CTabPage2。那多少个子框都有学号,姓名,性别八个edit框。程序展开时,暗许显示子框1。并体现学号、姓名、性其他暗中同意值。今后想定义多个全局变量学号,姓名,性别。难题意气风发:那多个全局变量如何在OnInitDialog里初步化?难点二:那多少个变量如何让子框1,和子框2显示?难题三:怎么样兑今后子框1更正那多个变量,在切换成子框2时,子框2会自动加载更新这多个变量?在子框2修正时,子框1相通自动加载更新。PS:笔者是贰个VC未入门的在下,各位大佬能够讲详细点吗?例如在哪个文件的哪位岗位加多什么样变量,在哪些文件的哪些地点增多什么语句。英特网找了超级多资料啊,完全找不到那种小白级其余课程。就好像这种第一步做什么样,第二部做什么样那种教程笔者很赏识,可是对于这几个主题素材好像找不到啊。今后找到的那多少个都以讲得很笼统的,小白表示看不懂什么意思。就像是那种间接讲用什么函数啊,小编怎么用那几个函数?小编直接用提示报错啊。肯定是因为运用地点不对,变量没概念之类的错误。小白表示现身这种也不领会咋办啊。到底在怎么着岗位该做如何事情?

C++开拓人脸性别识别教程(12)——增添性别识别功用

  经过在此以前几篇博客的上书,大家早就成功搭建了MFC应用框架,并促成了着力的图像彰显和人脸检查评定程序,在这里篇博文中大家要向里面增多性别识别代码。

  关于性别鉴定分别,以前已经非常拿出两篇博客的篇幅来开展教学,这里不再赘言,具体参见:C++开辟人脸性别识别教程(5)——通过FaceRecognizer类完毕性别鉴定区别和C++开垦人脸性别识别教程(6)——通过SVM达成性别鉴定识别。

  大器晚成、分类器演习

  在张开人脸性别识别此前供给演习性别鉴其他分类器,而分类器的教练进程是相对耗费时间的(差不离五分钟),因而这里大家采纳离线锻练在线识其他方式,即提前将分类器锻炼好,作为程序的数据开展封存,程序运维过程中央直属机关接加载已经操练好的分类器实行性别分类,那样速度就能够大大升高。

bb电子糖果派对VS二〇一〇 MFC的Tab控件怎样得以达成子框的变量和函数互用?。  在上边提供的两篇博客中都详细介绍了性别鉴定分别分类器的练习方法,这里一同供给操练多种分类器,分别是PCA、Fisher、LBP、SVM:

bb电子糖果派对 1

  二、加多下拉列表控件

  1、绘制控件

  由于这里有各个性别鉴其余秘诀,因而在程序运维时,要求顾客钦点生机勃勃种性别鉴其他措施,这里提供叁个下拉选用列表(Combo Box)控件来供顾客接受。首先从工具箱中当选该控件,在MFC主窗口的熨帖岗位展开绘图,并将ID校勘为IDC_COMBO_FUNCTION:

bb电子糖果派对 2

  2、内定选项值

  接下去必要在CGenderRecognitionMFCDlg类的OnInitDialog()开始化函数中为下拉列表设置ID标号以致对应的彰显文本:

    /*********初始化Combo Box控件**********/
    ((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->AddString("PCA变换");
    ((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->AddString("Fisher变换");
    ((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->AddString("LBP变换");
    ((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->AddString("支持向量机");
    ((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->SetCurSel(1);      //设置当前默认显示选项

  注意这里Combo Box控件的生机勃勃大器晚成选项的标号是默许从“0”初步张开标记的,即这里“0”代表“PCA转换”,“1”代表“Fisher转换”,“2”代表“LBP转变”,“3”代表“扶植向量机”,暗中同意展现”Fisher转变“:

bb电子糖果派对 3

  这里有五个小细节要求留意:

  (1)必要提前钦点Combo Box的下拉限制,这样技能确认保证在单击下拉开关时间调节件能够将富有选项全部出示出来:

bb电子糖果派对 4

  (2)Combo Box控件的”sort“属性,应该置为”false“:

bb电子糖果派对 5

  三、加多性别识别算法

  绘制完ComboBox控件之后,起先向里面填入性别鉴定识别算法。

  1、全局变量注脚

  在事前性别识其他博客中介绍得很精通,在采取OpenCv封装的分类器早先,必要声明多少个静态的模版变量,大家这里将其声称为全局变量,放在GenderRecognitionMFCDlg.cpp文件的开端部分:

/************初始化性别分类器************/
static Ptr model_PCA = createEigenFaceRecognizer();    //PCA分类器
static Ptr model_Fisher = createFisherFaceRecognizer();//Fisher分类器
static Ptr model_LBP = createLBPHFaceRecognizer();     //LBP分类器
static CvSVM svm;                                                      //支持向量机分类器

  2、在”初叶化“开关中加载分类器

  这里将分类器的加载操作布置在”开首化“开关对应的风浪响应函数OnBnClickedButtonInitial()中,即顾客单击”早先化“按键之后,程序会依据方今顾客选取的办法来加载钦赐的分类器。由于须求依靠顾客如今在下拉列表中的选用情状来开展分类器的加载,由此需求下拿到客商的筛选的标号,然后经过switch语句达成成取舍的加载,代码如下:

    /**********根据用户的选择来加载分类器**********/
    int index = 0;
    index = ((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->GetCurSel();
    switch (index)
    {
    case 0:
        model_PCA->load("E:\性别识别数据库—CAS-PEAL\面部训练样本\PCA_Model.xml");
        break;
    case 1:
        model_Fisher->load("E:\性别识别数据库—CAS-PEAL\面部训练样本\Fisher_Model.xml");
        break;
    case 2:
        model_LBP->load("E:\性别识别数据库—CAS-PEAL\面部训练样本\LBP_Model.xml");
        break;
    case 3:
        svm.load("E:\性别识别数据库—CAS-PEAL\面部训练样本\SVM_SEX_Model.txt");
        break;
    default:
        break;
    }

  加载成功后,给出提示:

MessageBox("初始化完成");

  这里给出初步化函数的完全代码:

void CGenderRecognitionMFCDlg::OnBnClickedButtonInitial()
{
    m_boolInitOK = true;
    cascade = cvLoadHaarClassifierCascade("D:\opencv\sources\data\haarcascades
\haarcascade_frontalface_alt_tree.xml",cvSize(30,30));
    storage = cvCreateMemStorage(0);

    /**********根据用户的选择来加载分类器**********/
    int index = 0;
    index = ((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->GetCurSel();
    switch (index)
    {
    case 0:
        model_PCA->load("E:\性别识别数据库—CAS-PEAL\面部训练样本\PCA_Model.xml");
        break;
    case 1:
        model_Fisher->load("E:\性别识别数据库—CAS-PEAL\面部训练样本\Fisher_Model.xml");
        break;
    case 2:
        model_LBP->load("E:\性别识别数据库—CAS-PEAL\面部训练样本\LBP_Model.xml");
        break;
    case 3:
        svm.load("E:\性别识别数据库—CAS-PEAL\面部训练样本\SVM_SEX_Model.txt");
        break;
    default:
        break;
    }
    MessageBox("初始化完成");
    // TODO: 在此添加控件通知处理程序代码
}

  3、编写性别识别函数

  将性别鉴定区别编写为二个名字为GenderRecognition(IplImage* img)的函数,将其看作成员函数加多到CGenderRecognitionMFCDlg类中:

bb电子糖果派对 6

  然后再向CGenderRecognitionMFCDlg类中增添二个int类型的标签,用来保存对脚下图片的远望结果(“1”代表男子,“2”代表女子):

bb电子糖果派对 7

  接下去发轫编写性别识别函数,与事前加载分类器的流程相像,这里相仿要求看清顾客所筛选的办法的评释,然后调用对应的分类器对输入图片展开远望,可是这里须要先将输入的IplImage类型变量转变为Mat类型变量,代码如下:

    Mat image(img);
    Mat trainImg;
    resize(image,image,Size(92,112));

    /***********根据当前用户选择的方法来使用对应的分类器进行分类**********/
    int index = 0;
    index     = ((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->GetCurSel();
    switch (index)
    {
    case 0:
        {
            m_genderLabel = model_PCA->predict(image);
            break;
        }
    case 1:
        {
            m_genderLabel = model_Fisher->predict(image);
            break;
        }
    case 2:
        {
            m_genderLabel = model_LBP->predict(image);
            break;
        }
    case 3:
        {
            resize(image, trainImg, cv::Size(64,64), 0, 0, INTER_CUBIC);
            HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8), 9);  
            vectordescriptors; 
            hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); 
            Mat SVMtrainMat =  Mat::zeros(1,descriptors.size(),CV_32FC1);    
            int n=0;    
            for(vector::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)    
            {    
                SVMtrainMat.at(0,n) = *iter;    
                n++;    
            }  
            m_genderLabel = svm.predict(SVMtrainMat);
            break;
        }
    default:
        {
            break;
        }
    }

  这里须求静心的某个就是在接收SVM进行性别鉴别时,同样需求先提取测量试验样板的HOG特征,参数设置要与以前操练时的HOG参数设置相像,具体参见:C++开垦人脸性别识别教程(6)——通过SVM落成性别鉴定识别。同期要将测量检验样品先归生机勃勃化到和操练样品相通的尺码,这里为92*112。

  4、展现识别结果

  大家统筹通过一个编辑框控件(Edit Control)来浮现当前图片的性别鉴定区别结果,即m_genderRecognition为“1”时展示“帅哥”,为“2”时展现“漂亮的女子”。首先在主分界面上绘制那些控件,并将其ID内定为IDC_EDIT_RecognitionResult。

  然后大家在GenderRecognition()函数中加多结果呈现代码:

    /**********显示识别结果**********/
    if (1 == m_genderLabel)
    {
        GetDlgItem(IDC_EDIT_RESULT)->SetWindowText("帅哥");
    }
    else if(2 == m_genderLabel)
    {
        GetDlgItem(IDC_EDIT_RESULT)->SetWindowText("美女");
    }

  当时性别鉴定分别函数编写成功,这里给出该函数的完好代码:

void CGenderRecognitionMFCDlg::GenderRecognition(IplImage* img)
{
    Mat image(img);
    Mat trainImg;
    resize(image,image,Size(92,112));

    /***********根据当前用户选择的方法来使用对应的分类器进行分类**********/
    int index = 0;
    index     = ((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->GetCurSel();
    switch (index)
    {
    case 0:
        {
            m_genderLabel = model_PCA->predict(image);
            break;
        }
    case 1:
        {
            m_genderLabel = model_Fisher->predict(image);
            break;
        }
    case 2:
        {
            m_genderLabel = model_LBP->predict(image);
            break;
        }
    case 3:
        {
            resize(image, trainImg, cv::Size(64,64), 0, 0, INTER_CUBIC);
            HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8), 9);  
            vectordescriptors; 
            hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); 
            Mat SVMtrainMat =  Mat::zeros(1,descriptors.size(),CV_32FC1);    
            int n=0;    
            for(vector::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)    
            {    
                SVMtrainMat.at(0,n) = *iter;    
                n++;    
            }  
            m_genderLabel = svm.predict(SVMtrainMat);
            break;
        }
    default:
        {
            break;
        }
    }

    /**********显示识别结果**********/
    if (1 == m_genderLabel)
    {
        GetDlgItem(IDC_EDIT_RESULT)->SetWindowText("帅哥");
    }
    else if(2 == m_genderLabel)
    {
        GetDlgItem(IDC_EDIT_RESULT)->SetWindowText("美女");
    }
}

  四、调用性别识别函数

  编写完性别识别函数之后,我们就足以打算调用这些函数来实行性别鉴定分别了,由于程序的兼顾是先实行人脸检查实验,然后开展性别鉴定识别,由此大家思谋在人脸检验函数detect_and_draw()中调用这性子别鉴定分别函数。

  1、人脸区域分割

  显明,在进展人脸检查评定之后,大家需求将检验到的人脸区域分割出来,再送入GenderRecognition()性别鉴定识别函数中展开识别,由此大家供给向detect_and_draw()函数中增加人脸区域分割的代码。

  首先,深入分析一下detect_and_draw(IplImage* img)函数中现成变量的意思:

  IplImage*img:为输入的庐山面目目图像,须要在这里个原始图像上进展人脸区域分割;

  IplImage*gray:为灰度化的图像,但gray经过了直方图均衡化的操作,招致其错失了庐山真面目指向性别消息,因此不可能用其进展性别鉴定分别,这也就象征大家须求重新对原始图像img举办灰度化操作,然后开展剪切;

  CvRect* rect:保存了人脸检查测验的结果,供给依照那么些矩形的职位和 尺寸来实行人脸区域分割。

  OK,经过上述解析,大家付出人脸区域分割的代码:

    /**********分割人脸区域**********/
    cvSetImageROI(img,*rect);                //设置图像人脸部分ROI区域
    IplImage* faceImage = cvCreateImage(cvSize(rect->width,rect->width),IPL_DEPTH_8U,1);
    if (img->nChannels = 3)
    {
        cvCvtColor(img,faceImage, CV_BGR2GRAY);//将图像灰度化存放在gray中 
    }
    else
    {
        faceImage = img;
    }
    cvResetImageROI(img);

    /**********性别识别**********/
    GenderRecognition(faceImage);
    cvReleaseImage(&faceImage);

  这里在开展区域分割时行使了安装ROI区域的主意,那是OpenCv1.x中的方法,在2.x中的Mat类型中封装了进一层精练的章程,详见OpenCV中ROI 总括。

  构思到在进展人脸检查实验时会现身检测战败的情事,若是大家在人脸检测失利的事态下仍百折不回启用人脸分割及性别鉴定识别程序,程序就能因为各样变量的未定义而夭亡,因而大家那边选取将这段人脸分割、性别鉴其余代码放在if语句中,保障其唯有在人脸检测成功的场地下才履行,为了有扶助大家清理逻辑,这里给出detect_and_draw()函数修改后的完整代码:

void CGenderRecognitionMFCDlg::detect_and_draw(IplImage* img)
{
    /**********初始化**********/
    IplImage* gray = cvCreateImage(cvSize(img->width,img->height),8,1);

    /**********灰度化**********/
    if (img->nChannels = 3)
    {
        cvCvtColor(img,gray, CV_BGR2GRAY);//将图像灰度化存放在gray中 
    }
    else
    {
        gray = img;
    }

    /**********直方图均衡**********/
    cvEqualizeHist(gray,gray); 

    /**********人脸检测**********/
    cvClearMemStorage(storage);
    CvSeq* objects = cvHaarDetectObjects(gray,//待检测图像  
        cascade,                              //分类器标识 
        storage,                              //存储检测到的候选矩形 
        1.3,                                  //相邻两次检测中窗口扩大的比例 
        3,                                    //认为是人脸的最小矩形数(阈值) 
        0,                                    //CV_HAAR_DO_CANNY_PRUNING
        cvSize(30,30));                       //初始检测窗口大小

    /**********对检测出的人脸区域面积做比较,选取其中的最大矩形**********/
    int maxface_label = 0;                    //最大面积人脸标签
    Mat max_face = Mat::zeros(objects->elem_size,1,CV_32FC1);                     //候选矩形面积
    for(int i = 0;i< objects->total;i++)
    {
        CvRect* r = (CvRect*)cvGetSeqElem(objects,i);
        max_face.at(i,0) = (float)(r->height * r->width);
        if(i > 0&&max_face.at(i,0) > max_face.at(i - 1,0))
        {
            maxface_label = i;
        }

    }

    /**********绘制检测结果**********/
    if(objects->total > 0)                    //如果人脸检测成功
    {
        CvRect* rect = (CvRect*)cvGetSeqElem(objects,maxface_label);
        cvRectangle(img,cvPoint(rect->x,rect->y),
            cvPoint(rect->x + rect->width,rect->y + rect->height),cvScalar(0.0,255));

      /**********分割人脸区域**********/
      cvSetImageROI(img,*rect);                  //设置图像人脸部分ROI区域
      IplImage* faceImage = cvCreateImage(cvSize(rect->width,rect->width),IPL_DEPTH_8U,1);
      if (img->nChannels = 3)
      {
          cvCvtColor(img,faceImage, CV_BGR2GRAY);//将图像灰度化存放在gray中 
      }
      else
      {
          faceImage = img;
      }
      cvResetImageROI(img);

      /**********性别识别**********/
      GenderRecognition(faceImage);
      cvReleaseImage(&faceImage);
    }

    /**********在图像控件上显示图像**********/
    CvvImage cvvImage;
    cvvImage.CopyOf(img);
    cvvImage.DrawToHDC(m_pPicCtlHdc,m_PicCtlRect);
    cvReleaseImage(&gray); 
}

  OK,水到渠成:

bb电子糖果派对 8

  四、总结

  经过那篇博客之后,能够说咱俩的性别鉴定区别MFC程序已经主导成型,具有了图片读取与展示,人脸检查测验、性别鉴定分别等基本成效,在接下去的博文中我们将介绍怎么着進展摄像头录制流的人脸性别识别。不过这里有多少个难题亟待再行强调一下。

  1、分类器连串

  从前我们说程序中用到了各个性别鉴定识别分类器:PCA、Fisher、LBP、SVM。其实这种说法是不严格的,这里只是有二种API函数,而从分类器层面元帅独有二种分类器。后面四个真相上都以用的K近邻分类器,只是提取了二种差别的表征而已。

  2、MFC教程

  在这里个程序的开支进程中用到了无数MFC的相干文化,假设我们期望系统摸底MFC开辟的有关怀意事项及工夫的话,推荐我们仿效孙鑫先生的MFC摄像教程。那几个录像教程相比长,大家有选取性的求学就可以。

  3、增多最初化完结的晋升对话框

  这里大家向“起先化”开关的响应函数中加多了开头化实现的升迁对话框,原因是加载分类器的长河须要差不离5秒左右的时光,增加八个形成提醒对话框会使得程序显得更有提醒性,更温馨。

  4、resource.h文件的效益

  resource.h保存了当下财富(各样空间,图片,字符串)的ID号,必要时我们可以从这些文件中搜寻:

bb电子糖果派对 9

 

  5、全局变量

  程序中不引入应用静态的全局变量,会骤降程序的安全性。

经过以前几篇博客的解说,大家早就成功搭建了MFC应用框架,并促成了骨干的图像显...

Readme文档


选择的手艺及页面流程

选择的手艺:

根基知识:HTML+CSS+JavaScript

UI设计:Semantic-UI Semantic UI 官方网站

分界面逻辑:jQuery jQuery教程

文件读写、电火花计时器:NodeJS NodeJS文档

xlsx文件读写:SheetJS的js-xlsx库 js-xlsx的Github地址

App框架:nwjs nwjs文档

例如急需庞大改革程序的话,提出中肯学习HTML+CSS+JavaScript和jQuery这两有的,推荐应用Brackets(开源、无偿、是本来Adobe的门类,品质过硬,最要紧的是狼狈卡塔尔国举办代码编辑

页面流程:

具备的分界面用html完结,整个程序的流程能够总结为

index.html-->login.html-->welcome.html-->question.html-->end.html

即:首页-->音讯搜集分界面-->测量检验前的分界面-->选用选项分界面-->测量检验结束分界面

除此以外从首页能够踏向批处理程序分界面index.html-->batch.html

界面与分界面之间的通信都以透过global中保留的剧情开展。

友情链接: 网站地图
Copyright © 2015-2019 http://www.tk-web.com. bb电子糖果派对有限公司 版权所有