zoukankan      html  css  js  c++  java
  • 基于VC面部识别软件(识别出人脸特征)

    最近在学校MFC和Opencv,毕业只是做面部识别软件,所以写一个,我觉得很简单。

    第一个VC组态opencv。不用说。非常easy,网上资料非常多,然后就是设计界面啦,这个全然凭个人喜好了,我设计的界面是这种:

    然后就是拍照。保存图片。这个也非常easy,网上资料也非常多,就简单粘贴一下代码吧:

    这是打开摄像头的代码:

    pwnd = GetDlgItem(IDC_STATIC1);    
        pDC =pwnd->GetDC();  
        hDC= pDC->GetSafeHdc();  
        pwnd->GetClientRect(&rect);
    if (!camera.OpenCamera(0,false))  
        {  
            AfxMessageBox("无法打开摄像头");  
            return;  
        }  
      
        //IplImage* m_Frame;  
        m_Frame=camera.QueryFrame();  
        CvvImage m_CvvImage;  
        m_CvvImage.CopyOf(m_Frame,1);     
        if (true)  
        {  
            m_CvvImage.DrawToHDC(hDC, &rect);  
            //cvWaitKey(10);  
        }  
        // 设置计时器,每10ms触发一次事件  
        SetTimer(1,10,NULL); 

    }

    关闭摄像头:

    void CBishe5_1Dlg::OnButton3() 
    {
    // TODO: Add your control notification handler code here
    camera.CloseCamera();
    KillTimer(1);
    }

    保存图片并在第二的picture框中显示:

    // TODO: Add your message handler code here and/or call default
    pwnd = GetDlgItem(IDC_STATIC1);    
        pDC =pwnd->GetDC();  
        hDC= pDC->GetSafeHdc();  
        pwnd->GetClientRect(&rect);
    m_Frame=camera.QueryFrame();
      
        CvvImage m_CvvImage;  
        m_CvvImage.CopyOf(m_Frame,1);     
        if (true)  
    {  
            m_CvvImage.DrawToHDC(hDC, &rect); 
            //cvWaitKey(10);  
        }

    CDialog::OnTimer(nIDEvent);
    }

    
    

    在摄像头拍摄图片中还遇到了问题,应该是兼容性的问题。我是在win7系统上执行VC和opencv1.0,当中opencv1.0中打开摄像头操作无法执行,后来搞了好长时间。找了一些资料,后来将打开摄像头等操作代码不调用opencv1.0的。自己写代码从win7的API调用,此段代码是一个大神写的。非常好用,十分感谢他的,代码非常长,就不粘贴了,网上细致找找都有。

    接下来就是图像识别了,这个我感觉非常easy,我花了一下人脸识别的程序框图,帮助大家理解一下:


    事实上程序非常easy,我就张贴一下我的找出人脸并圈出人脸的代码,其它鼻子嘴巴等五官识别都差点儿相同:

    CvSeq* FaceDet(IplImage* imgSrc, IplImage* imgDst)
    {
    if(imgSrc != imgDst)
    {
    cvReleaseImage(&imgDst);
    imgDst = cvCloneImage(imgSrc);
    }


    const char* cascade = "haarcascade_frontalface_alt2.xml";
    CString file = getXMLFile(cascade);

    CvSeq * faces = CvHarrEx(imgSrc, NULL, /*FACEXML*/file, cvSize(20, 20));


    if(!faces)
    {
    MessageBox(NULL,"此人长得太帅!

    !导致计算机无法识别。实在不好意思", "", 0);
    return NULL;
    }


    //Reduce(faces);

    int i, n = faces->total;
    CvRect* r;


    //--check whether have eyes in the face
    for(i = 0; i < n; i++)
    {
       r = (CvRect*)cvGetSeqElem( faces, i );

    if( CvHarrEx(imgSrc, r, /*EYERXML*/getXMLFile("ojoD.xml"), cvSize(18, 12)) == NULL)
    {
    cvSeqRemove(faces, i);
    i--;
    n = faces->total;
    }
    }


    DrawCircle(imgSrc, imgDst, faces, cvPoint(0,0));
    return faces;
    }

    终于结果是将人脸五官全识别并圈出来:


    详细就这些了,全程序我打包发在CSDN的下载中把,事实上还没搞完,原本想建,把家人的脸都训练成模板,建一个模型库,然后当外人出如今摄像头前,在模板库中找不到匹配的模板,然后报警。

    嗯嗯,小弟刚開始学,比与水相比,。第一次写博客,很多关注大神。

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    泛函编程(29)-泛函实用结构:Trampoline-不再怕StackOverflow
    泛函编程(28)-粗俗浅解:Functor, Applicative, Monad
    泛函编程(27)-泛函编程模式-Monad Transformer
    泛函编程(26)-泛函数据类型-Monad-Applicative Functor Traversal
    泛函编程(25)-泛函数据类型-Monad-Applicative
    mac安装iterm2
    像使用linux一样使用mac
    springboot工程自动生成工具
    mysql insert返回主键
    linux rz sz命令
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4710795.html
Copyright © 2011-2022 走看看