嵌入式开发五:未来之星机器人语音控制及视频开发(颜色追踪)(运动追踪)
Author:朱本福 Address:桂林電子科技大學(xué),智能科學(xué)與技術(shù) E-mial:zhubenfulovepoem@163.com QQ:896922782 技術(shù)交流群:圖像處理分析與機(jī)器視覺(群號:109128646)? ? ? ? 本群主要做圖像處理,分析與通信及機(jī)器視覺相關(guān)的理論研究和工程實踐。 項目合作群:伯爾曼智能科技hi-tech(群號:173234390) ? ? ??義務(wù)一:技術(shù)交友,項目合作,家庭生活隨便聊!……
? ? ? 義務(wù)二:定期公布潛在項目方案和想法,供大家使用 ? ? ? 從事高速信號采集處理,智能信息處理,計算機(jī)視覺,智能機(jī)器人,人機(jī)交互的軟硬件研究
摘要:?
首先簡述了語音識別在機(jī)器人控制系統(tǒng)中的作用,然后重點介紹如何利用Microsoft Speech SDK工具來開發(fā)語音識別軟件系統(tǒng),對機(jī)器人進(jìn)行的語音命令控制和簡單的語音人機(jī)對話,對設(shè)計具有語音識別功能的智能機(jī)器人具有參考意義。
關(guān)鍵詞:: 機(jī)器人語音控制;語音人機(jī)交互;Speech SDK
?
一、Speech SDK語音識別過程詳解:
?????? ?目前,語音識別技術(shù)因為其實用性、趣味性成為國內(nèi)外關(guān)注的熱點。微軟、IBM等公司都相繼推出了它們基于PC的語音識別產(chǎn)品。其中,微軟Speech SDK完全支持簡體中文語音系統(tǒng)的開發(fā),是開發(fā)語音軟件的一個理想工具。它是基于COM標(biāo)準(zhǔn)開發(fā)的,底層協(xié)議以COM組件的形式完全獨立于應(yīng)用程序?qū)?#xff0c;為應(yīng)用程序設(shè)計人員屏蔽了復(fù)雜的語音技術(shù),充分體現(xiàn)了COM的技術(shù)優(yōu)點。語音識別由識別引擎(Recognition Engine)管理,能實現(xiàn)從語音中識別出漢字;語音合成由語音合成引擎(也即文本到語音引擎TTS Engine)負(fù)責(zé),實現(xiàn)語音朗讀。程序員只需專注于自己的應(yīng)用,調(diào)用相關(guān)的語音應(yīng)用程序接口(SAPI)來實現(xiàn)語音功能。
該語音框架主要靠SAPI運行來實現(xiàn)應(yīng)用程序與語音引擎之間的協(xié)作,而SAPI提供各種接口來實現(xiàn)不同的語音功能,如識別、朗讀、訓(xùn)練等。
下面只介紹與控制命令識別有關(guān)的接口:
(1)?? 語音識別引擎(ISpRecognizer)接口:用于創(chuàng)建語音識別引擎的實例。語音識別引擎對象有兩種:獨占(InProcRecognizer)的引擎和共享(SharedRecognizer)的引擎。獨占的引擎對象只能由創(chuàng)建的應(yīng)用程序使用,而共享的引擎可以
供多個應(yīng)用程序共同使用。
(2)?? 語音識別上下文(ISpRecoContext)接口:主要用于發(fā)送和接收與語音識別相關(guān)的消息通知,創(chuàng)建語法規(guī)則對象。
(3)?? 語法規(guī)則(ISpRecoGrammar)接口:定義引擎需要識別的具體內(nèi)容,用于創(chuàng)建、載入和激活識別用的語法規(guī)則。而語法規(guī)則定義了期望識別的單詞、短語和句子,通常有兩種語法規(guī)則:聽寫語法(DictationGrammer)和命令控制語法(Command and Control Grammer)。命令控制語法主要用于識別用戶在語法文件里自定義的一些特定的命令詞匯和句子,這些語法規(guī)則以XML文件的格式編寫,通過(ISpRecoGrammar)接口載入,并激活。
(4)?? 識別結(jié)果(ISpPhr ase)接口:用于獲取識別的結(jié)果,包括識別的文字,識別的語法規(guī)則等。
(5)?? 語音合成(ISpVoice)接口:主要功能是通過訪問TTS引擎實現(xiàn)文本到語音的轉(zhuǎn)換,從而使電腦會說話。
?
二、機(jī)器人語音控制軟件系統(tǒng)設(shè)計:
語音識別的功能由ISpRecognizer、ISpRecoContext、ISpRecoGrammar、ISpPhrase四個接口實現(xiàn),而且遵循COM組件的工作原理和Windows應(yīng)用程序的工作原理(消息驅(qū)動機(jī)制),軟件系統(tǒng)實現(xiàn)分以下幾步:
(1)?? 首先,初始化COM平臺;
(2)?? 定義各個語音接口對象(以特定的順序),設(shè)置識別語法、識別消息,使識別引擎處于工作狀態(tài);
(3)?? 當(dāng)有語法規(guī)則被識別后, ISpRecoContext對象向應(yīng)用程序發(fā)出語音識別消息,從而調(diào)用識別消息響應(yīng)函數(shù);在改消息函數(shù)中,通過ISpPhrase接口獲取識別的結(jié)果。此步可以循環(huán),直到停止語法規(guī)則為止。
(4)?? 應(yīng)用程序退出時,卸載COM平臺。語音識別軟件系統(tǒng)流程如圖4所示,硬件只需在原來的機(jī)器人系統(tǒng)上配置麥克風(fēng)。
?
三、程序?qū)嵗?/p>
(1)?? 編寫語法規(guī)則文件(Cmd.xml),以定義需要識別的命令。
<GRAMMARLANGID="804">
?? <DEFINE>
????? <ID NAME="CMD"VAL="10"/>
?? </DEFINE>
?? <RULE NAME="COMMAND"ID="CMD" TOPLEVEL="ACTIVE">
???? <L>
????? <p>前進(jìn)</P>
????? <p>后退</P>
????? <p>左轉(zhuǎn)</p>
????? <p>右轉(zhuǎn)</p>
????? <P>停止</P>
???? </L>
?? </RULE>
</GRAMMAR>
?
(2)系統(tǒng)的初始化
1. 在Visual c++ 6. 0中建立一個基于MFC的對話框工程;
2. 在該工程的入口函數(shù)處初始化COM平臺:
????? ?HRESULT hr=CoInitialize(NULL);
3. 在對話框類的頭文件中定義建立語音識別需要的接口對象
????? ?CComPtr<ISpRecognizer>m_pRecognizer;
????? ?CComPtr<ISpRecoContext>m_pRecoCtxt;
????? ?CComPtr<ISpRecoGrammar>m_pCmdGram;
????? ?CComPtr<ISpAudio>m_pAudio;
4. 在對話框類的初始化函數(shù)OnInitDialog()中建立的各個對象進(jìn)行初始化:
5. 創(chuàng)建一個獨占型語音識別引擎
m_pRecognizer.CoCreateInstance(CLSID_SpInprocRecognizer);
6. 創(chuàng)建命令識別上下文
????? ?m _ p R e c o g n i z e r->CreateRecoContext(&m_pRecoCtxt);
7. 設(shè)置語音事件通知自定義消息WM_RECORD_INFO;在程序中將此消息與OnRecord函數(shù)綁定,這樣才能識別后激活OnRecord函數(shù)。
M_pRecoCtxt->SetNotifyWindowMessage(mhWnd,WM_RECORD_INFO,0,0);
8. 告訴識別引擎,我們只感興趣命令識別事
?m-pRecoCtxt->SetInterest(SPFEI(SPEI_RECOGNITION)
SPFEI(SPEI_RECOGNITION));
9. 創(chuàng)建默認(rèn)的音頻輸入對象SpCreateDefaultObjectFromCategoryId ( SPCAT_AUDIOIN,&m_pAudio);
10. 將上面的音頻輸入對象作為識別引擎對象的音頻輸入源
????? ?m_pRecognizer->SetInput(m_pAudio,TRUE;
11.??? 創(chuàng)建語法規(guī)則,并從Cmd.xml文件裝載語法規(guī)則
m_pRecoCtxt->CreateGrammar(GID_SRCMD_CN ,&m_pCmdGram);
m_pCmdGram->LoadCmdFromFile(L″test.xml″,SPLO_DYNAMIC);
12. 激活語法規(guī)則
????? g_cpCmdGrammar->SetRuleState(NULL,NULL,SPRS_ACTIVE);
?
(3)消息函數(shù)的實現(xiàn)
????? ?經(jīng)過上述初始化工作后,識別引擎就可以工作,按如圖4所示的流程。如果有正確的命令輸入,則按照語法規(guī)則被識別,語音接口向應(yīng)用程序發(fā)出語音識別通知消息WM_RECORD_INFO,從而調(diào)用消息函數(shù)OnReord(),其實現(xiàn)表示為
?
(4)主要實現(xiàn)代碼:
//點擊按鈕打開語音識別
voidCFstarTestDlg::OnVoice()
{
?????? // TODO: Add your control notificationhandler code here
?????? CString cs;
?????? CButton *pBtn=(CButton*)GetDlgItem(IDC_VOICE);????? //"語音開啟"按鈕指針
?????? pBtn->GetWindowText(cs);
?????? if (cs=="語音開啟")????????
//根據(jù)按鈕文本進(jìn)行不同的操作,可以實現(xiàn)開始和停止兩種功能
?????? {
????????????? m_Reco.Start(CMD_MODE);
//設(shè)置語音識別為指令模式——按照語法文件列舉的選項進(jìn)行識別
????????????? pBtn->SetWindowText("語音關(guān)閉");
?????? }
?????? else
?????? {
????????????? m_staVoice.SetWindowText("");
????????????? m_Reco.SetState(STOPRECO);??? //停止語音識別
????????????? pBtn->SetWindowText("語音開啟");
?????? }
}
語音識別響應(yīng)函數(shù):
voidCReco::AfterCmd(CString inStr)
{
?????? if (inStr == "前進(jìn)" && m_pCmd != NULL){
????????????? m_pCmd->SetBothMotorsSpeed(2000,-2000);}
?????? if (inStr == "后退" && m_pCmd != NULL){
????????????? m_pCmd->SetBothMotorsSpeed(-2000,2000);}
?????? if (inStr == "左轉(zhuǎn)" && m_pCmd != NULL){
????????????? m_pCmd->SetBothMotorsSpeed(-1800,-1800);}?????
?????? if (inStr == "右轉(zhuǎn)" && m_pCmd != NULL){
????????????? m_pCmd->SetBothMotorsSpeed(1800,1800);}
?????? if (inStr == "停止" && m_pCmd != NULL){
????????????? m_pCmd->SetBothMotorsSpeed(0,0);}
?????? if (inStr == "開燈" && m_pCmd != NULL){
????????????? m_pCmd->TurnOnLgt(3);}
?????? if (inStr == "關(guān)燈" && m_pCmd != NULL){
????????????? m_pCmd->TurnOffLgt(3);}
?????? m_pTxtOut->SetWindowText(inStr);
}
while(event.GetFrom(m_cpRecoCtxt) == S_OK)
??? {
??????? switch (event.eEventId)
??????? {
????????????? case SPEI_SOUND_START:
???????????????????? break;
????????????????????
????????????? case SPEI_SOUND_END:
???????????????????? break;
????????????????????
????????????? case SPEI_RECOGNITION:
???????????????????? // There may be multiplerecognition results, so get all of them
???????????????????? {
??????????????????????????? //識別出了語音輸入
??????????????????????????? static const WCHARwszUnrecognized[] = L"<Unrecognized>";
???????????????????????????
??????????????????????????? CSpDynamicStringdstrText;
???????????????????????????
??????????????????????????? //取得識別結(jié)果
???????????????????? ?????? if (FAILED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE,SP_GETWHOLEPHRASE, TRUE
?????????????????????????????????? ,&dstrText,NULL)))
??????????????????????????? {
?????????????????????????????????? dstrText =wszUnrecognized;
??????????????????????????? }
???????????????????????????
??????????????????????????? BSTR SRout;
??????????????????????????? dstrText.CopyToBSTR(&SRout);
???????????????????????????
??????????????????????????? m_RecStr.Empty();
??????????????????????????? m_RecStr = SRout;
???????????????????????????
??????????????????????????? switch(m_nState)
??????????????????????????? {
??????????????????????????? case CMD_MODE:
?????????????????????????????????? AfterCmd(m_RecStr);
?????????????????????????????????? break;
??????????????????????????? case TXT_MODE:
?????????????????????????????????? AfterTxt(m_RecStr);
?????????????????????????????????? break;
??????????????????????????? }
???????????????????????????
???????????????????? }
???????????????????? break;
????????????????????
??????? }
}
?
四、實驗結(jié)果分析與總結(jié):
實驗軟件運行在博創(chuàng)科技的機(jī)器人平臺未來之星上,通過麥克風(fēng)機(jī)器車基本能夠響應(yīng)語音命令,前進(jìn),后退,左轉(zhuǎn),右轉(zhuǎn),開關(guān),關(guān)燈;識別率90%以上,但是對于嘈雜環(huán)境識別率明顯降低,需要后續(xù)的語音信號處理。
?
五、擴(kuò)展操作視頻處理處理
(1)Directshow介紹:
DirectShow是微軟公司在ActiveMovie和Video for Windows的基礎(chǔ)上推出的新一代基于COM(ComponentObject Model)的流媒體處理的開發(fā)包,與DirectX開發(fā)包一起發(fā)布。DirectShow使用一種叫Filter Graph的模型來管理整個數(shù)據(jù)流的處理過程,運用DirectShow,我們可以很方便地從支持WDM驅(qū)動模型的采集卡上捕獲數(shù)據(jù),并且進(jìn)行相應(yīng)的后期處理乃至存儲到文件中。這樣使在多媒體數(shù)據(jù)庫管理系統(tǒng)(MDBMS)中多媒體數(shù)據(jù)的存取變得更加方便。它廣泛地支持各種媒體格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等,為多媒體流的捕捉和回放提供了強(qiáng)有力的支持。
DirectShow還集成了DirectX其它部分(比如DirectDraw、DirectSound)的技術(shù),直接支持DVD的播放,視頻的非線性編輯,以及與數(shù)字?jǐn)z像機(jī)的數(shù)據(jù)交換。
DirectShow使用一種叫FilterGraph的模型來管理整個數(shù)據(jù)流的處理過程;參與數(shù)據(jù)處理的各個功能模塊叫做Filter;各個Filter在Filter Graph中按一定的順序連接成一條“流水線”協(xié)同工作。大家可以看到,按照功能來分,Filter大致分為三類:Source Filters、Transform Filters和RenderingFilters。Source Filters主要負(fù)責(zé)取得數(shù)據(jù),數(shù)據(jù)源可以是文件、因特網(wǎng)、或者計算機(jī)里的采集卡、數(shù)字?jǐn)z像機(jī)等,然后將數(shù)據(jù)往下傳輸;Transform Fitlers主要負(fù)責(zé)數(shù)據(jù)的格式轉(zhuǎn)換、傳輸;Rendering Filtes主要負(fù)責(zé)數(shù)據(jù)的最終去向,我們可以將數(shù)據(jù)送給聲卡、顯卡進(jìn)行多媒體的演示,也可以輸出到文件進(jìn)行存儲。值得注意的是,三個部分并不是都只有一個Filter去完成功能。恰恰相反,每個部分往往是有幾個Fitler協(xié)同工作的。比如,Transform Filters可能包含了一個Mpeg的解碼Filter、以及視頻色彩空間的轉(zhuǎn)換Filter、音頻采樣頻率轉(zhuǎn)換Filter等等。除了系統(tǒng)提供的大量Filter外,我們可以定制自己的Filter,以完成我們需要的功能。
?
(2)實現(xiàn)功能:
1、FstarVideo完成有RGB轉(zhuǎn)化為亮度空間,可以用于檢測黑線,完成巡線,尋光等操作.
主要操作代碼1:
for (int x =0;x< m_nWidth;x++)????? //m_nWidth為視頻的寬度
{
????? for(int y =0;y<m_nHeight;y++)??//m_nHeight為視頻的寬度
????? {
????? //?? Median(x,y,prgb);??? ?// 中值濾波
????? //?? prewitt(x,y,prgb,2.0);? //prewitt算子
????? ??? GetColor(x,y,prgb);?? //獲得xy坐標(biāo)處的顏色值
//亮度空間轉(zhuǎn)換???????????
tY =0.299*prgb->rgbtRed + 0.587*prgb->rgbtGreen + 0.114*prgb->rgbtBlue;??
?//將RGB顏色空間轉(zhuǎn)換為亮度空間
????? if(tY>230) ?//追蹤亮度??? //tY為亮度閾值
????? {
?????????? //SetColor(x,y,black);?? //二值化,將坐標(biāo)xy處像素值設(shè)為黑色???????????????????
?????????? m_pParam->Yx+= x;??
?????????? m_pParam->Yy+= y;
?????????? m_pParam->Ysum++;
?????????? //計算被標(biāo)記的點數(shù)量(不繪制總標(biāo)記重心則可以去掉)
?????????? m_nCX = m_pParam->Yx/m_pParam->Ysum;
?????????? m_nCY=m_pParam->Yy/m_pParam->Ysum;
?????????? prgb->rgbtBlue=0;
?????????? prgb->rgbtGreen= 0xff;??
?????????? prgb->rgbtRed= 0;
?????????? DrawFocus(x,y,prgb);?? //以綠色繪制滿足tY的像素值??????????????????????????????? ?
????? }else
?????????? SetColor(x,y,white);?? //使這個區(qū)域的像素為白色。
}
主要操作代碼2:
//為該區(qū)域像素變紅色
????? for (int m =400;m<426;m++)
????? {
?????????? for (int n=75;n<86;n++)
?????????? {
???????????????? SetColor(m,n,red);??
?????????? }
????? }?????????????????????????????????????
????? //對每個像素進(jìn)行操作
????? for (int p=400;p<409;p++)? //查詢像素值
????? {
?????????? for (int q=400;q<409;q++)
?????????? {
?? ????? prgb->rgbtBlue =m_pImageBuf[q*m_nWidth*3 + p*3];
????? ????? prgb->rgbtGreen = m_pImageBuf[q*m_nWidth*3 + p*3 + 1];
????? ????? prgb->rgbtRed = m_pImageBuf[q*m_nWidth*3 + p*3 + 2];
????? ?????????? //操作像素值
????? ????? if(prgb->rgbtBlue==0&& prgb->rgbtGreen==0xff && prgb->rgbtRed==0)
//綠色像素進(jìn)行操作??? {
????? ??? SetColor(p,q,black);? //使p,q之間的區(qū)域為黑色??? }
?????????? }
????? }
處理實例分析與總結(jié):
該實驗中數(shù)據(jù)量很大,不能完成基本的中值濾波,或者prewitt算子濾波。
2、實現(xiàn)顏色追蹤,本次實驗主要針對紅色追蹤:
主要程序一:
?????? ?????? m_vDemo.m_para.ReSet();?? ??//設(shè)置復(fù)位顏色值,RGB各分量全為零
?????? ?????? m_vDemo.m_para.Ven= TRUE;??
?????? ?????? m_vDemo.m_para.Vmin= 55;?? //設(shè)置顏色閾值范圍
?????? ?????? m_vDemo.m_para.Vmax= 120;
?????? ?????? m_pCap->SetCmd(&m_cmd);
?????? ?????? m_cmd.SetBehavior(&m_vDemo);
主要程序一:
for (int x =0;x< m_nWidth;x++)
{
for (int y =0;y<m_nHeight;y++)
{
??? GetColor(x,y,prgb);
??? flag= FALSE;??? //判斷結(jié)果標(biāo)記
//根據(jù)使能變量決定是否進(jìn)行顏色空間轉(zhuǎn)換
??? if(m_pParam->Ven == TRUE)
??? {
?????????? tV= 0.5*prgb->rgbtRed - 0.45*prgb->rgbtGreen - 0.05*prgb->rgbtBlue;
?????????? if(m_pParam->Vmin<tV && tV<m_pParam->Vmax)
?????????? {
????????????????? m_pParam->Vx+= x;
????????????????? m_pParam->Vy+= y;
????????????????? m_pParam->Vsum++;
????????????????? flag= TRUE;
?????????? }
??? }
if (flag == TRUE)
?????????? SetColor(x,y,red);?? //檢測到紅色后將其標(biāo)記為紅色
?????????? }
?????????? }
??? }
else
{???? //只進(jìn)行統(tǒng)計
for (int x=0;x< m_nWidth-1;x++)
{
for (int y =0;y<m_nHeight-1;y++)
{
??? GetColor(x,y,prgb);
??? //根據(jù)使能標(biāo)記進(jìn)行顏色空間變換
??? if(m_pParam->Ven == TRUE)
??? {
?????????? tV= 0.5*prgb->rgbtRed- 0.45*prgb->rgbtGreen - 0.05*prgb->rgbtBlue;;
?????????? if(m_pParam->Vmin<tV && tV<m_pParam->Vmax)
?????????? {
????????????????? m_pParam->Vx+= x;
????????????????? m_pParam->Vy+= y;
????????????????? m_pParam->Vsum++;
?????????? }
??? }
if (m_pParam->Yen == TRUE)
??? {
?????????? tY= 0;
?????????? if(m_pParam->Ymin<tY && tY<m_pParam->Ymax)
?????????? {
?????????? ?????? m_pParam->Yx += x;
????????????????? m_pParam->Yy+= y;
????????????????? m_pParam->Ysum++;
?????????? }
??? }}}}
??? //開始繪制顏色重心點
??? //如果沒有找到任何點則返回
if(m_pParam->Ysum< 1 && m_pParam->Usum < 1 && m_pParam->Vsum < 1)
{
delete prgb;
m_pParam->bBusy = FALSE;
return FALSE;
}
//計算被標(biāo)記的點數(shù)量(不繪制總標(biāo)記重心則可以去掉)
m_nCX =(m_pParam->Ux +m_pParam->Vx + m_pParam->Yx)/(m_pParam->Usum + m_pParam->Vsum +m_pParam->Ysum);
m_nCY=(m_pParam->Uy +m_pParam->Vy + m_pParam->Yy)/(m_pParam->Usum + m_pParam->Vsum +m_pParam->Ysum);
??? prgb->rgbtBlue=0;
??? prgb->rgbtGreen= 0xff;
??? prgb->rgbtRed= 0;
??? DrawFocus(m_nCX,m_nCY,prgb);? //對中心部分作為繪制綠色點
//計算各重心坐標(biāo)
if(m_pParam->Ven == TRUE)
{
m_pParam->Vx =m_pParam->Vx/m_pParam->Vsum;
m_pParam->Vy =m_pParam->Vy/m_pParam->Vsum;
}
實驗結(jié)果分析:
3、實現(xiàn)運動追蹤:
3.1、理論研究:
視頻圖像中的運動追蹤的首要工作是確定場景中存在的運動目標(biāo),即運動目標(biāo)的檢測。并且檢測要達(dá)到以下要求:
(1)對環(huán)境的緩慢變化(如光照變化等)不敏感;
(2)對于復(fù)雜背景和復(fù)雜目標(biāo)有效;
(3)能適應(yīng)場景中個別物體運動的干擾(如樹木的搖晃,水面的波動等);
(4)能夠去除目標(biāo)陰影的影響;
(5)檢測和分割的結(jié)果應(yīng)滿足后續(xù)處理(如跟蹤等)的精度要求。
?
3.2、運動目標(biāo)檢測常用的方法有:
(1)幀間差分法
幀間差分法是檢測相鄰圖像之間變化的最簡單方法,主要利用視頻序列中連續(xù)的兩幀或幾幀圖像的差異來進(jìn)行目標(biāo)檢測和提取。
幀間差分法的特點:
用幀間差分法進(jìn)行目標(biāo)檢測和分割,算法復(fù)雜度低,便于實時使用。由于相鄰幀的時間間隔一般較短,因此該方法對場景光線的變化一般不太敏感,穩(wěn)定性較好。但是檢測中依賴于選擇的幀時間間隔,對快速運動的物體,需要選擇較小的時間間隔。如果選擇不合適,當(dāng)物體在前后兩幀中沒有重疊時會被檢測為兩個分開的物體;而對慢速運動的物體應(yīng)該選擇較大的時間差,如果此時選擇不適當(dāng),物體在前后兩幀中幾乎完全重疊,則檢測不到物體。且一般都不能完全提取出所有的特征像素點,這樣在運動實體內(nèi)部容易產(chǎn)生空洞現(xiàn)象,即使進(jìn)行了必要的數(shù)字圖像的形態(tài)學(xué)處理和連通性分析,也不能得到運動目標(biāo)的完整輪廓,給以后的運動目標(biāo)識別和檢測帶來了困難。
(2)背景相減法
這種方法能夠較完整的提取目標(biāo)點,但對場景的動態(tài)變化如光照或外部條件引起的場景變化較為敏感。如果參考圖像選取適當(dāng),這種方法的優(yōu)點是可以準(zhǔn)確地分割出運動物體。但是,該方法成功與否依賴于所采用的背景圖像。如何獲取一個相對準(zhǔn)確的背景圖像是背景相減法的一個重點內(nèi)容,通常利用背景更新的方法以彌補(bǔ)動態(tài)場景中的光線變化等因素帶來的不利影響。
引起背景變化的原因
①光照變化:包括連續(xù)的光照變化,通常是室外環(huán)境;突然的光照變化,通常是室內(nèi)環(huán)境中關(guān)燈或者室外晴天出現(xiàn)烏云等情況;投影到背景中的陰影,這既可能是背景自己產(chǎn)生的陰影,如大樓、樹,也可能是前景目標(biāo)自身的陰影。
②背景擾動:背景中存在的如風(fēng)中樹葉的搖動、水面波光的閃動、車窗玻璃的反光以及天氣變化等許多細(xì)微活動,都會影響到運動目標(biāo)的檢測。再如室外攝像機(jī)受風(fēng)吹而抖動同樣會影響運動目標(biāo)的檢測。
③背景變化:運動目標(biāo)引起的背景變化包括人將某個東西帶入或帶出背景,汽車駛?cè)牖蝰偝?#xff0c;或者人或物在場景中停留一陣后又運動的情況。
④遮擋問題:遮擋也是運動目標(biāo)檢測過程中一個難以解決的問題,在運動目標(biāo)前方的遮擋物能會作為目標(biāo)的一部分被提取出來,從而造成檢測目標(biāo)變形嚴(yán)重,甚至還會檢測目標(biāo)的失敗。這些因素都會大大提高背景建模及背景更新的難度,影響到檢測的效果。
?
3.3、運動目標(biāo)檢測前需要對視頻數(shù)據(jù)進(jìn)行處理,常用的處理方法有:
(1)統(tǒng)計平均法:
該方法通過對連續(xù)的圖像序列進(jìn)行統(tǒng)計平均來獲得背景圖像,即連續(xù)采集N幀圖像累加求平均,式中N為圖像幀數(shù)。
這種更新方法在每次更新時考慮利用當(dāng)前幀信息而廢棄過時信息,從而有利于背景自適應(yīng)地跟隨新環(huán)境的變化而變化。算法簡單易實現(xiàn),由于采用遞歸算法,故時間開銷小。
該算法的不足之處是需要保存幀圖像的數(shù)據(jù),增加了空間的開銷。這種方法通常用于場景內(nèi)目標(biāo)滯留時間較小、目標(biāo)出現(xiàn)不頻繁的情況。但是統(tǒng)計平均法無法滿足實時性要求。
?
(2)中值濾波器法
通常在背景模型提取階段,運動目標(biāo)可以在監(jiān)視區(qū)域運動,但不會長時間停留在某一個位置上。對視頻畫面中某一像素進(jìn)行一段時間的觀測,可以發(fā)現(xiàn),只有在前景目標(biāo)通過該點時,它的亮度值才發(fā)生大的變化。中值濾波法的思想是先建
立一個視頻流滑窗用來緩存L張視頻幀,然后把緩存中所有視頻幀同位置像素的中值作為背景中該處像素的值。
L值的大小由運動目標(biāo)通過的速度和攝像機(jī)拍攝時的采樣速率等因素決定。
?
(3)GMM方法
在一段較長時間內(nèi),對圖像中同一位置的像素點進(jìn)行采集,該像素點作為背景圖像上的一點,在理想狀態(tài)下,采樣值應(yīng)該是某一個固定值,但是由于光照等自然因素的影響存在偏差。在統(tǒng)計意義下,這些采樣值是服從單高斯分布模型的,它們主要集中在概率大的高斯模型的中心位置上,而在該點上出現(xiàn)的運動目標(biāo)則是屬于發(fā)生概率小的遠(yuǎn)離高斯模型中心的部分。因此我們可以計算這個像素點的平均亮度μ0,以及它的方差σ02,用各點像素的亮度均值組成的具有高斯分布的圖像作為背景圖像B0,其中
但是,用單高斯模型來描述背景是不夠的。例如,在某幀中一個像素可能表示天空,但在另一幀中則可能表示樹葉,而在第3幀中則又可能表示樹枝。顯然,每一種狀態(tài)下的像素亮度(顏色)值是不同的,因此可以對這些多模態(tài)情形使用多個高斯模型來混合建模。設(shè)用來描述每個點像素值的高斯分布共有k個,分別記為η(x,u,μit,σit),i =1,2,...,k,則有
如果沒有任何高斯模型與當(dāng)前亮度值匹配,則將權(quán)重最小的高斯分量以一個新的高斯模型替代。新高斯模型的內(nèi)核密度均值為It ,偏差為最大初始偏差,權(quán)重為最小初始權(quán)重。其他高斯分布模型不變,只降低它們的權(quán)重,即
混合高斯法在背景建模過程中由于允許運動目標(biāo)存在,因此尤其適合室外有光線和天氣變化的小而速度快的運動目標(biāo)的檢測。它的缺點首先是計算復(fù)雜,不僅對背景建模,實際上也對前景建模,其計算復(fù)雜度與高斯模型的個數(shù)成正比,而且模型參數(shù)難調(diào)。其次,它對大而慢的目標(biāo)檢測效果也不好,特別是會將紋理少或?qū)Ρ榷鹊偷哪繕?biāo)當(dāng)作背景。第三就是它對全局亮度的突然變化非常敏感,如果場景很長時間沒變,則背景分量的變化就非常小,但是全局亮度的突然變化會將
整個視頻幀認(rèn)為是前景。
?
3.4、工程實踐:
本文主要用幀間差分法做運動追蹤。
六、 結(jié)論
?????? ?采用語音識別技術(shù)將人類之間的交流方式應(yīng)用于人類與機(jī)器之間,是機(jī)器人智能水平的重要標(biāo)志。
?????? ?本文闡明了語音接口的工作原理和開發(fā)程序,對于開發(fā)設(shè)計具有語音識別的智能機(jī)器人,具有很高的參考價值。
?
七、參考文獻(xiàn)
[1]?? Microsoft Speech 5.1 SDK Help [Z].
[2]?? 博創(chuàng)科技未來之星實驗指導(dǎo)書(第二版)
[3]?? 駱家偉,基于MicrosoftSpeech SDK的語音程序的設(shè)計與實現(xiàn),2009
[4]? 宋坤, 劉銳寧, 馬文強(qiáng),Visual C++視頻技術(shù)方案寶典
[5]? 陳兵旗, 孫明,Visual C++實用圖像處理專業(yè)教程
[6]? 左飛, 萬晉森, 劉航,Visual C++數(shù)字圖像處理開發(fā)入門與編程實踐
[7]? 劉瑞禎, 于仕琪,OpenCV教程.基礎(chǔ)篇
[8]? 馮偉興,唐墨,賀波,,馮偉興,唐墨,賀波
?
八、附錄:
(1)中值濾波法,中值濾波法是一種非線性平滑技術(shù),它將每一象素點的灰度值設(shè)置為該點某鄰域窗口內(nèi)的所有象素點灰度值的中值.
實現(xiàn)方法:
1:通過從圖像中的某個采樣窗口取出奇數(shù)個數(shù)據(jù)進(jìn)行排序
2:用排序后的中值取代要處理的數(shù)據(jù)即可
中值濾波法對消除椒鹽噪音非常有效,在光學(xué)測量條紋圖象的相位分析處理方法中有特殊作用,但在條紋中心分析方法中作用不大.
中值濾波在圖像處理中,常用于用來保護(hù)邊緣信息,是經(jīng)典的平滑噪聲的方法
中值濾波原理
中值濾波是基于排序統(tǒng)計理論的一種能有效抑制噪聲的非線性信號處理技術(shù),中值濾波的基本原理是把數(shù)字圖像或數(shù)字序列中一點的值用該點的一個鄰域中各點值的中值代替,讓周圍的像素值接近的真實值,從而消除孤立的噪聲點。方法是去某種結(jié)構(gòu)的二維滑動模板,將板內(nèi)像素按照像素值的大小進(jìn)行排序,生成單調(diào)上升(或下降)的為二維數(shù)據(jù)序列。二維中值濾波輸出為g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分別為原始圖像和處理后圖像。W為二維模板,通常為2*2,3*3區(qū)域,也可以是不同的的形狀,如線狀,圓形,十字形,圓環(huán)形等。
?
(2)Prewitt算子:
Prewitt算子是一種一階微分算子的邊緣檢測,利用像素點上下、左右鄰點的灰度差,在邊緣處達(dá)到極值檢測邊緣,去掉部分偽邊緣,對噪聲具有平滑作用。其原理是在圖像空間利用兩個方向模板與圖像進(jìn)行鄰域卷積來完成的,這兩個方向模板一個檢測水平邊緣,一個檢測垂直邊緣。
對數(shù)字圖像f(x,y),Prewitt算子的定義如下:
G(i)=|[f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)]-[f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)]|
G(j)=|[f(i-1,j+1)+f(i,j+1)+f(i+1,j+1)]-[f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)]|
則 P(i,j)=max[G(i),G(j)]或P(i,j)=G(i)+G(j)
經(jīng)典Prewitt算子認(rèn)為:凡灰度新值大于或等于閾值的像素點都是邊緣點。即選擇適當(dāng)?shù)拈撝礣,若P(i,j)≥T,則(i,j)為邊緣點,P(i,j)為邊緣圖像。這種判定是欠合理的,會造成邊緣點的誤判,因為許多噪聲點的灰度值也很大,而且對于幅值較小的邊緣點,其邊緣反而丟失了。
//prewitt
總結(jié)
以上是生活随笔為你收集整理的嵌入式开发五:未来之星机器人语音控制及视频开发(颜色追踪)(运动追踪)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unity动态更换鼠标光标
- 下一篇: 安身立命之本