SLAM從入門到放棄:SLAM十四講第八章習題(1-3)
阿新 • • 發佈:2018-12-20
以下均為簡單筆記,如有錯誤,請多多指教。
- 除了LK光流之外,還有哪些光流方法?它們各有什麼特點?
答:此答案轉載於:https://blog.csdn.net/iloveayu/article/details/76728412。
Barron等人對多種光流計算技術進行了總結,按照理論基礎與數學方法的區別把它們分成四種:基於梯度的方法、基於匹配的方法、基於能量的方法、基於相位的方法。當然除了這些方法之外,現在也有非常多基於深度學習的方法,例如flownet。
1、基於梯度的方法
基於梯度的方法又稱為微分法,它是利用時變影象灰度(或其濾波形式)的時空微分(即時空梯度函式)來計算畫素的速度向量。由於計算簡單和較好的結果,該方法得到了廣泛應用和研究。典型的代表是Horn-Schunck的光流計算方法,該方法在光流基本約束方程的基礎上附加了全域性平滑假設,從而計算出光流場。基於此思想,大量的改進演算法不斷提出。Nagel採用有條件的平滑約束,即通過加權矩陣的控制對梯度進行不同平滑處理;Black和Anandan針對多運動的估計問題,提出了分段平滑的方法。雖然很多基於梯度的光流估計方法取得了較好的光流估計,但由於在計算光流時涉及到可調引數的人工選取、可靠性評價因子的選擇困難,以及預處理對光流計算結果的影響,在應用光流對目標進行實時檢測與自動跟蹤時仍存在很多問題。
2、基於匹配的方法
-
在本節程式的求影象梯度過程中,我們簡單地求了和的灰度之差除以,作為方向上的梯度值。這種做法有什麼缺點?提示:對於距離較近的特徵,變化應該較快;而距離較遠的特徵在影象中變化較慢,求梯度時能否利用此資訊? 答:個人看法,可能不是很完整。缺點主要有兩個。第一個就如提示所示,距離較近的特徵運動較快,不是十分符合光流中運動較小的假設,可能會使得光流跟蹤失敗;第二個問題就是,在影象的採集過程中必然存在噪聲等等影響,簡單的相減必然有大量的噪聲,也會對光流產生干擾。
-
在稀疏直接法中,假設單個畫素周圍小塊的光度也不變,是否可以提高演算法健壯性?請程式設計實現。 答:參照https://www.cnblogs.com/newneul/p/8571653.html的思路,如果假設周圍小塊的光度也不變,可以利用一個畫素塊的灰度值來代替當前一個畫素的灰度值。整體而言程式碼的改變不大,主要是在ComputeError()中殘差項的計算換成一個基於畫素塊的殘差計算。
float sumValue = 0.0;
for(int i = x-PATCH_RADIUS ; i<= x+PATCH_RADIUS ; ++i)
{
for (int j = y-PATCH_RADIUS; j <= y+PATCH_RADIUS ; ++j)
{
sumValue += getPixelValue(i,j);
}
}
sumValue /=( (2*PATCH_RADIUS +1)*(2*PATCH_RADIUS+1) ); //求得元素周圍小塊的平均灰度值
_error (0,0) = sumValue - _measurement;
不過感覺純粹的求取平均值並不是特別合理,個人感覺比較合理方法是進行高斯加權,一般情況下這樣會更加魯邦。
float sigma;
float sumValue = 0.0;
float sumGauss = 0.0;
for(int i = x-PATCH_RADIUS ; i<= x+PATCH_RADIUS ; ++i)
{
for (int j = y-PATCH_RADIUS; j <= y+PATCH_RADIUS ; ++j)
{
float gaussValue = exp(-(i*i+j*j)/(2*sigma*sigma))/(2*3.1415926*sigma*sigma);
sumValue += getPixelValue(i,j)*gaussValue ;
sumGauss += gaussValue;
}
}
sumValue /= sumGauss;
_error (0,0) = sumValue - _measurement;