自主实时人脸识别系统

Posted

技术标签:

【中文标题】自主实时人脸识别系统【英文标题】:Autonomous real-time face recognition system 【发布时间】:2014-01-25 11:34:28 【问题描述】:

我是编程和图像处理的新手。最近我开发了一个系统,可以从视频中检测人脸并识别人。如果该人已经在数据库中可用,它将他/她的名字标记到框架中,否则如果该人是新人,它会询问他们的姓名并拍摄足够的照片并存储在数据库中,以便下次识别该人.我正在使用 Fisher-faces 算法来完成这项任务。 现在我的问题是,我想让系统说话。我希望它告诉它最近识别的人的姓名。 我可以使用

static class Once  public: Once()talk(); Once_; 

调用函数talk一次。 但它不是有机的,并且谈话功能不接受用户的输入。

谁能给我建议一个解决方案,或者从哪里开始解决这个问题。

通话功能是

int speech(char* value)


ISpVoice * pVoice = NULL;

if (FAILED(::CoInitialize(NULL)))
    return FALSE;

HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )

    hr = pVoice->Speak(L"userINPUT", SPF_IS_XML, NULL);
    pVoice->Release();
    pVoice = NULL;


::CoUninitialize();
return TRUE;

【问题讨论】:

你的静态类 Once 的目的是什么?为什么不只是在识别后调用速度,你知道名字吗? (请编辑并称之为“说话”之类的,而不是“速度” 我在识别后调用语音,但是函数 hr = pVoice->Speak(L"userINPUT", SPF_IS_XML, NULL);不支持用户输入。它只是将 userIndut 读取为文本 我需要一个可以将用户输入作为属性或参数传递的语音函数 在here 中传递字符串没问题,只需跳过 SPF_IS_XML 标志并将名称作为输入传递。你可能想要 SPF_ASYNC ;) 哦,如果你使用异步,你不能在调用 Speak, ofc 后立即释放它。也许做一个“语音”课程? 【参考方案1】:

所以,这是我的建议:

// -- >8 ---------- speech.h --------------------------
#ifndef __speech_onboard__
#define __speech_onboard__


struct ISpVoice; // fwd ref, since mixing opencv and windows headers is a receipt for desaster

namespace Speech

    class Voice
    
        ISpVoice * spVoice;

    public:

        Voice();
        ~Voice();


        int speak( const char * txt, int flags=0 ) const ;

        // Supported values range from -10 to 10 
        int setRate( int s );

        // Supported values range from 0 to 100 
        int setVolume( int s );
    ;
;


#endif // __speech_onboard__



// ---- >8 speech.cpp ------------------------------
#include <windows.h>
#include <sapi.h>
#include "speech.h"


#define COM_RELEASE(x)  if ((x)) (x)->Release(); (x) = NULL; 


namespace Speech

    struct _ComUser
    
        _ComUser()  CoInitialize(0);
        ~_ComUser() CoUninitialize();
     _we_need_a_singleton_per_module;


    inline int w2a( WCHAR *in, char *out )
    
        out[0]=0;
        return WideCharToMultiByte(CP_ACP, 0, in, -1, out, MAX_PATH, 0, 0); 
    

    inline int a2w( const char *in, WCHAR *out )
    
        out[0]=0;
        return MultiByteToWideChar(CP_ACP, 0, in, -1, out, MAX_PATH); 
    




    Voice::Voice()
        : spVoice(0)
    
        HRESULT hr = CoCreateInstance( CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (LPVOID *)&(spVoice) ); 
    


    Voice::~Voice()
    
        COM_RELEASE( spVoice );
    

    //SPF_ASYNC = ( 1L << 0 ) ,
    //SPF_PURGEBEFORESPEAK  = ( 1L << 1 ) ,
    //SPF_IS_FILENAME   = ( 1L << 2 ) ,
    //SPF_IS_XML    = ( 1L << 3 ) ,
    //SPF_IS_NOT_XML    = ( 1L << 4 ) ,
    //SPF_PERSIST_XML   = ( 1L << 5 ) ,
    //SPF_NLP_SPEAK_PUNC    = ( 1L << 6 ) ,
    //SPF_PARSE_SAPI    = ( 1L << 7 ) ,
    //SPF_PARSE_SSML    = ( 1L << 8 ) ,
    //SPF_PARSE_AUTODETECT  = 0,
    int Voice::speak( const char * txt, int flags ) const 
    
        if ( ! spVoice )
            return 0;

        WCHAR wtxt[800];
        a2w(txt,wtxt);

        ULONG pulstream = 0;
        HRESULT hr = spVoice->Speak( wtxt, flags, &pulstream );

        return hr==S_OK; 
    


    // Supported values range from -10 to 10 
    int Voice::setRate( int s )
    
        if ( ! spVoice )
            return 0;

        HRESULT hr = spVoice->SetRate( s );

        return hr==S_OK; 
    

    // Supported values range from 0 to 100 
    int Voice::setVolume( int s )
    
        if ( ! spVoice )
            return 0;

        HRESULT hr = spVoice->SetVolume ( s );

        return hr==S_OK; 
    




// ----- >8 main.cpp --------------------------------------------

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

#include "speech.h"

int main(int argc, char** argv)

    Speech::Voice voice;
    voice.speak("hello , oh, hello!", 1); // async

    Mat img(300,300,CV_8UC3,Scalar(255,0,0));
    namedWindow("Display window",0);
    putText(img,"lala la",Point(20,120),0,2.5,Scalar(0,200,0),5);
    imshow("Display window", img);
    waitKey(0);

    voice.speak("bye bye, see you later !"); // sync
    return 0;

【讨论】:

看起来不错,我现在就试试,会回来的。 我有一个小问题,Invoice.speak("hello , oh, hello!", 1);我可以从用户那里传递一个字符串吗,例如 voice.speak("hello" inputstring, 1); 我找到了这个link

以上是关于自主实时人脸识别系统的主要内容,如果未能解决你的问题,请参考以下文章

Python+OpenCV4.5实时人脸识别系统

GitHub 6大热门实时人脸识别开源项目!哪个最适合初级开发者?

Python+OpenCV实现AI人脸识别身份认证系统—人脸识别原理

人脸识别完整项目实战(14):实时人脸特征点标定程序设计

人脸识别(face recognition)

实现工地实名制门禁管理的人脸识别系统