高斯混合模型建立背景 |
缺席
|
dmjohnny
一般會員 發表:3 回覆:9 積分:2 註冊:2008-10-01 發送簡訊給我 |
我是用OPENCV開一個AVI的檔案然後用GMM去建立背景模型
但是遇到了幾個問題 1.不應該被移動到的背景物變得模糊不清 2.利用OPENCV的cvCvtColor可以轉成灰階卻無法轉回彩色 3.不知道為什麼一開始建立背景模型會有一些黑色的區塊(以解決主要是調整參數就好了) 請板上高手為我解答非常感謝 |
dmjohnny
一般會員 發表:3 回覆:9 積分:2 註冊:2008-10-01 發送簡訊給我 |
===================引 用 dmjohnny 文 章=================== 我是用OPENCV開一個AVI的檔案然後用GMM去建立背景模型 但是遇到了幾個問題 1.不應該被移動到的背景物變得模糊不清 2.利用OPENCV的cvCvtColor可以轉成灰階卻無法轉回彩色 3.不知道為什麼一開始建立背景模型會有一些黑色的區塊(以解決主要是調整參數就好了) 請板上高手為我解答非常感謝 以下是我發現可能有問題的地方請板上高手幫助我解決我的BUG 首先第一個問題我將影像調慢撥放後發現影像似乎沒有對齊所以才會造成不該移動的邊緣模糊不清 所以我嚐試驗證我的副程式但是我卻找不到我自己認為不合理的地方Orz 上半段是我認為比較可能發生錯誤的地方 下半段則是我button裡面的流程 請板上高手幫我解答非常感謝 [code cpp] //----------------------------ProcessFrame----------------------------- void TForm1::ProcessFrame(int wy, int hy) { int i,s,j,k,I,g; int dvar0,mG,dsWt,nG,dvar,dp0,dp,deta; for(i=0; i s = 1; for(j=0; j k = i*wy*3 j; I = cvmGet(m_pFrMat,i,j); dvar0 = 100 * (1 (I-GmmMatrix[k 0].mean)*(I-GmmMatrix[k 0].mean)) / (1 GmmMatrix[k 0].variance); mG = 0; GmmMatrix[k 0].dweight = (multirate-dalpha)*GmmMatrix[k 0].dweight/multirate; dsWt = GmmMatrix[k 0].dweight; nG = 0; for(g=1; g dvar = 100 * (1 (I-GmmMatrix[k g].mean)*(I-GmmMatrix[k g].mean)) / (1 GmmMatrix[k g].variance); GmmMatrix[k g].dweight = (multirate-alpha)*GmmMatrix[k g].dweight/multirate; dsWt = dsWt GmmMatrix[k g].dweight; if(dvar < dvar0) { dvar0 = dvar; mG = g; //matched } } if(dvar0 > 100*num2) { nG = 0; dp0 = 100 * (1 GmmMatrix[k 0].dweight*GmmMatrix[k 0].dweight) / (1 GmmMatrix[k 0].variance); for(g=1; g dp = 100 * (1 GmmMatrix[k g].dweight*GmmMatrix[k g].dweight) / (1 GmmMatrix[k g].variance); if(dp < dp0) { dp0 = dp; nG = g; } } GmmMatrix[k nG].mean = I; GmmMatrix[k nG].variance = 50; GmmMatrix[k nG].dweight = 30; GmmMatrix[k nG].match = true; GmmMatrix[k nG].matchLeng = 1; GmmMatrix[k nG].matchTimes = 1; continue; } deta = I-GmmMatrix[k mG].mean; GmmMatrix[k mG].mean = GmmMatrix[k mG].mean deta/100; GmmMatrix[k mG].variance = max((dOnemialpha*GmmMatrix[k mG].variance dalpha*(I-GmmMatrix[k mG].mean)*(I-GmmMatrix[k mG].mean))/multirate,25); GmmMatrix[k mG].dweight = GmmMatrix[k mG].dweight alpha_rate*dalpha; if(GmmMatrix[k mG].match == false) { GmmMatrix[k mG].matchTimes = 1; GmmMatrix[k mG].match = true; } GmmMatrix[k mG].matchLeng = 1; dsWt = dsWt alpha*alpha_rate; for(g=0; g GmmMatrix[k g].dweight = GmmMatrix[k g].dweight*1000/dsWt; if(g != mG) { GmmMatrix[k g].match = false; } } } } } //----------------------------ProcessFrame----------------------------- //--------------------------BackgroungBuild---------------------------- void TForm1::BkBuild(int wy, int hy) { int i,j,k,b,g; int dm0,dm; for(i=0; i for(j=0; j k = i*wy*3 j; dm0 = GmmMatrix[k 0].dweight; b = 0; for(g=1; g dm = GmmMatrix[k g].dweight; if(dm > dm0) { dm0 = dm; b = g; } } if(GmmMatrix[k b].mean > 255) { GmmMatrix[k b].mean = 255; } if(GmmMatrix[k b].mean < 0) { GmmMatrix[k b].mean = 0; } cvmSet(m_pBkMat,i,j,GmmMatrix[k b].mean); //set background matrix cvmSet(m_pBkVarMat,i,j,GmmMatrix[k b].variance); } } } //--------------------------BackgroungBuild---------------------------- [/code] [code cpp] pFrameData = cvCreateImage(fr,IPL_DEPTH_8U,3); // cvCopy(FrameOri, pFrameData, NULL); cvResize(FrameOri, pFrameData, CV_INTER_LINEAR); cvCvtColor(pFrameData, pFrImg, CV_BGR2GRAY); cvCopy(pFrImg, pFrImgB,NULL); cvimg2array(pFrImg, wy/2, hy/2, ProcessData); m_pFrMat = cvCreateMat(hy/2, wy/2, CV_32FC1); cvConvert(pFrImg, m_pFrMat); ProcessFrame(wy/2, hy/2); BkBuild(wy/2, hy/2); cvConvert(m_pBkMat, pBkImgG); cvCvtColor(pBkImgG, pBkImgC, CV_GRAY2BGR); cvResize(pBkImgC, pFrameLast, CV_INTER_LINEAR); cvimg2array(pFrameLast,wf,hf,ProcessData); [/code] |
dmjohnny
一般會員 發表:3 回覆:9 積分:2 註冊:2008-10-01 發送簡訊給我 |
|
dmjohnny
一般會員 發表:3 回覆:9 積分:2 註冊:2008-10-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |