自主实时人脸识别系统
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以上是关于自主实时人脸识别系统的主要内容,如果未能解决你的问题,请参考以下文章
GitHub 6大热门实时人脸识别开源项目!哪个最适合初级开发者?