多頻外差法三維重建 結構光三維重建
阿新 • • 發佈:2019-01-04
結構光三維重建--多頻外差
結構光三維重建主要的原理就是從投影儀中投射一定頻率的結構光,這種光跟以前採用的格雷碼方式不同,它具有一定的正玄性。而多頻外差的方式說的就是採用幾種不同頻率的正玄光,為什麼採用多頻外差的方式,從我多年的實踐經驗來看,多頻外差法具有很好的抗干擾、對物體重建出來的細節保留的比較好、精度更高一些。下面我先梳理一下演算法細節。
相移:
在進行展開相位前,必須先獲得每點的包裹相位,其中最成熟最可靠的演算法是相移法,該方法已經實現了商品化。相移法[的最大優點還在於求解物體初相位時是點對點的運算,即在原理上某一點的相位值不受相鄰點光強值的影響,從而避免了物面反射率不均勻引起的誤差。其基本思想是:將一個光強分佈呈正弦變化的光柵作為面結構光投影到被測工件表面,所探測的正弦光柵受被測物體表面高度調製產生的光強函式可以用下式表示: (公式不好編輯,只好截圖了)
多頻外差演算法步驟:
我使用的是5個頻率的解碼:code 如下
oid MultiPhaseDec::decMultiPhase5(Mat *imgShift,Mat &imgAbsPhase) { //獲取wrap相位 F32 *dPtr = (F32*)imgAbsPhase.data; Mat imgPhase[5] ; for(int k=0;k<5;k++) imgPhase[k] = Mat::zeros(m_nHeight,m_nWidth,CV_32FC1); for(int n = 0;n<4;n++) { F32 *pha= (F32*)imgPhase[n].data; for(int k=0;k < m_nWidth*m_nHeight;k++) { pha[k] = (float)sqrt(atan2((double)(I1[k]-I3[k]),(double)(I0[k]-I2[k]))) ; } } Mat imgAbsPhase1= Mat::zeros(m_nHeight,m_nWidth,CV_32FC1); Mat imgAbsPhase2= Mat::zeros(m_nHeight,m_nWidth,CV_32FC1); Mat imgAbsPhase3= Mat::zeros(m_nHeight,m_nWidth,CV_32FC1); phaseUnWrap(imgPhase[0],imgPhase[1],imgAbsPhase1,m_dFreq[0],m_dFreq[1]); phaseUnWrap(imgAbsPhase1,imgPhase[2],imgAbsPhase2,m_dFreq[1],m_dFreq[2]); phaseUnWrap(imgAbsPhase2,imgPhase[3],imgAbsPhase3,m_dFreq[2],m_dFreq[3]); phaseUnWrap(imgAbsPhase3,imgPhase[4],imgAbsPhase,m_dFreq[3],m_dFreq[4]); //ImgShowPhase(imgPhase[0],"0"); // ImgShowPhase(imgPhase[1],"1"); //ImgShowPhase(imgPhase[2],"2"); //ImgShowPhase(imgPhase[3],"3"); // ImgShowPhase(imgPhase[4],"4"); // cvWaitKey(1000000); // // ImgShowAbsPhase(imgPhase[0],PI2,"abs0"); // ImgShowAbsPhase(imgAbsPhase1,3*PI2,"abs1"); // ImgShowAbsPhase(imgAbsPhase2,9*PI2,"abs2"); // ImgShowAbsPhase(imgAbsPhase3,27*PI2,"abs3"); // ImgShowAbsPhase(imgAbsPhase,81*PI2,"abs4"); // cvWaitKey(1000000); }
5個頻率打出來的光是這個樣子的,5個頻率的影象還是有點多哈
最後重建的效果如下圖:
有交流的留言或加QQ:1264768501