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