關於ransac
演算法的基本思想,可從網上搜尋找到,這裡只是ransac用於sift特徵匹配篩選時的一些說明。
ransac演算法在sift特徵篩選中的主要流程是:
(1) 從樣本集中隨機抽選乙個ransac樣本,即4個匹配點對
(2) 根據這4個匹配點對計算變換矩陣m
(3) 根據樣本集,變換矩陣m,和誤差度量函式計算滿足當前變換矩陣的一致集consensus,並返回一致集中元素個數
(4) 根據當前一致集中元素個數判斷是否最優(最大)一致集,若是則更新當前最優一致集
(5) 更新當前錯誤概率p,若p大於允許的最小錯誤概率則重複(1)至(4)繼續迭代,直到當前錯誤概率p小於最小錯誤概率
下面結合robhess的原始碼說明一下ransac演算法在sift特徵匹配篩選中的實現,
具體的原始碼分析見此系列文章:robhess的sift原始碼分析:綜述
在robhess的原始碼中,ransac演算法的宣告和實現在xform.h和xform.c檔案中
實現ransac演算法的主函式是ransac_xform,如下:
[cpp]view plain
copy
cvmat* ransac_xform( struct feature* features, int n, int mtype,
ransac_xform_fn xform_fn, int m, double p_badxform,
ransac_err_fn err_fn, double err_tol,
struct feature*** inliers, int* n_in )
函式說明:利用ransac演算法進行特徵點篩選,計算出最佳匹配的變換矩陣
引數:features:特徵點陣列,只有當mtype型別的匹配點存在時才被用來進行單應性計算
n:特徵點個數
mtype:決定使用每個特徵點的哪個匹配域進行變換矩陣的計算,應該是feature_mdl_match,
feature_bck_match,feature_mdl_match中的乙個。若是feature_mdl_match,
對應的匹配點對座標是每個特徵點的img_pt域和其匹配點的mdl_pt域,
否則,對應的匹配點對是每個特徵點的img_pt域和其匹配點的img_pt域。
xform_fn:函式指標,指向根據輸入的點對進行變換矩陣計算的函式,一般傳入lsq_homog()函式
m:在函式xform_fn中計算變換矩陣需要的最小特徵點對個數
p_badxform:允許的錯誤概率,即允許ransac演算法計算出的變換矩陣錯誤的概率,當前計算出的模型的錯誤概率小於p_badxform時迭代停止
err_fn:函式指標,對於給定的變換矩陣,計算推定的匹配點對之間的變換誤差,一般傳入homog_xfer_err()函式
err_tol:容錯度,對於給定的變換矩陣,在此範圍內的點對被認為是內點
inliers:輸出引數,指標陣列,指向計算出的最終的內點集合,若為空,表示沒計算出符合要求的一致集
此陣列的記憶體將在本函式中被分配,使用完後必須在呼叫出釋放:free(*inliers)
n_in:輸出引數,最終計算出的內點的數目
返回值:ransac演算法計算出的變換矩陣,若為空,表示出錯或無法計算出可接受矩陣
注釋如下:
[cpp]view plain
copy
cvmat* ransac_xform( struct feature* features, int n, int mtype,
ransac_xform_fn xform_fn, int m, double p_badxform,
ransac_err_fn err_fn, double err_tol,
struct feature*** inliers, int* n_in )
/* initialize random number generator */
srand( time(null) );//初始化隨機數生成器
//計算保證ransac最終計算出的轉換矩陣錯誤的概率小於p_badxform所需的最小內點數目
in_min = calc_min_inliers( nm, m, ransac_prob_bad_supp, p_badxform );
//當前計算出的模型的錯誤概率,內點所佔比例in_frac越大,錯誤概率越小;迭代次數k越大,錯誤概率越小
p = pow( 1.0 - pow( in_frac, m ), k );
i = 0;
//當前錯誤概率大於輸入的允許錯誤概率p_badxform,繼續迭代
while( p > p_badxform )
else
//若當前一致集小於歷史最優一致集,釋放當前一致集
free( consensus );
cvreleasemat( &m );
iteration_end:
release_mem( pts, mpts, sample );
p = pow( 1.0 - pow( in_frac, m ), ++k );
} //根據最優一致集計算最終的變換矩陣
/* calculate final transform based on best consensus set */
//若最優一致集中元素個數大於最低標準,即符合要求
if( in_max >= in_min )
if( n_in )
*n_in = in;//將最優一致集中元素個數賦值給輸出引數:n_in,即內點個數
release_mem( pts, mpts, consensus );
} else
if( consensus_max )
//ransac演算法結束:恢復特徵點中被更改的資料域feature_data,並返回變換矩陣m
end:
for( i = 0; i
free( matched );
return m;//返回求出的變換矩陣m
}
實驗測試:
[cpp]view plain
copy
//特徵提取和匹配
void match(iplimage *img1,iplimage *img2)
} free( nbrs );//釋放近鄰陣列
} qdebug()
cvnamedwindow(img_match1);//建立視窗
cvshowimage(img_match1,stacked);//顯示
//利用ransac演算法篩選匹配點,計算變換矩陣h
cvmat * h = ransac_xform(feat1,n1,feature_fwd_match,lsq_homog,4,0.01,homog_xfer_err,3.0,&inliers,&n_inliers);
qdebug()
for(int i=0; i
cvnamedwindow(img_match2);//建立視窗
cvshowimage(img_match2,stacked_ransac);//顯示
}
SIFT特徵檢測與RANSAC過濾
function siftdetect.cpp brief 對sift特徵檢測和匹配進行測試,並實現ransac演算法進行過濾錯配點 author ltc date 11 20 saturday,28 november,2015 include include includeusing namesp...
帶有Lowe s演算法的SIFT特徵提取和匹配
採用lowe s的演算法選出優秀匹配點。include highgui highgui.hpp include opencv2 nonfree nonfree.hpp include opencv2 legacy legacy.hpp include using namespace cv using...
SIFT特徵匹配
影象特徵分很多種,例如顏色特徵 紋理特徵 形狀特徵 空間關係特徵等。常用的特徵為sift特徵。sift scale invariantfeaturetransform,sift 具有以下特性 1 對平移 旋轉 伸縮 亮度 遮擋和雜訊等具有良好的不變性,對視覺變化 仿射變換也有一定的穩定性。2 即使少...