1)相關概念
1興趣點
在影象處理和計算機視覺領域,興趣點也被稱為 關鍵點或者特徵點被大量用於解決物體識別,影象識別,影象匹配,視覺追蹤,三維重建,等一系列問題,我們不再觀察整幅圖,而是選擇某些特殊的點,然後對他們進行分析,如果能檢測到足夠的這種點,同時他們的區分度很高,並且可以精準定位穩定的特徵,這個方法就具有實用價值,影象特徵型別被分為如下三種:
*邊緣
*角點(感興趣關鍵點)
*斑點(blob)(感興趣區域)
2角點
角點通常被定義為兩個邊的交點,也被定義為在任意方向上的乙個微小變動都會引起灰度很大變化的點,角點作為影象上的特徵點,包含有重要的資訊,在影象融合和目標追蹤以及三維重建中有重要應用價值,另外,角點的描述可以有如下幾種
&&一階導數(灰度的梯度)的區域性最大所對應的畫素點
&&兩條及兩條以上邊緣的交點
&&影象中梯度值和梯度放向的變化速率都很高的點
&&角點處一階導數最大,二階導數為0,他指明了物體邊緣變化不連續的方向
3 角點檢測
現有的角點檢測演算法並不是非常健壯,很多方法需要大量的訓練集合冗餘資料來防止或減少錯誤特徵的出現,另外,角點檢測方法的乙個重要衡量標準是對多福影象中相同或相似特徵的檢測能力,並且能夠應對光照變化,影象旋轉等變化,目前的角點檢測演算法可以歸結為以下三類
*基於灰度影象的 角點檢測
*基於二值影象的角點檢測
*基於輪廓曲線的 角點檢測
基於灰度影象的角點檢測又可以分為基於梯度,基於模板和基於模板梯度組合三類方法,其中基於模板的方法主要考慮畫素鄰域點的灰度變化,即影象亮度的變化,將與鄰點亮度對比足夠大的點定義為角點,常用的harris角點檢測演算法就是基於模板的角點檢測方法
2)harris角點檢測—cornerharris()
harris角點檢測是一種直接基於灰度影象的角點提取方法,穩定性高,但是由於採用高斯濾波,運算速度比較慢,角點資訊有丟失和位置偏移的現象,以及聚蔟的現象 opencv提供connerharris()函式來進行harris角點檢測,他是對每乙個畫素(x,y)在blocksize *blockssize 鄰域內,計算2*2梯度的協方差矩陣m(x,y)
就可以找到區域性最大值,也就是找到了角點,可以用閾值化篩選自己要的角點
void cornerharris(inputarray src ,outputarray dst,int blocksize,int ksize,double k,int bordertype=border_default);
&&src:輸入原圖,需為8位單通道或浮點型別影象
&&dst:harris角點檢測結果,型別為cv_32fc1,大小和原圖一樣
&&blocksize:鄰域大小,更多資訊檢視cornereigenvalsandvecs()
&&ksize:表示sobel()運算元孔徑大小
&&k:harris檢測常量引數,通常情況取值為0.04–0.0.6
&&bordertype:影象畫素的邊界模式,一般採用預設值
cvtcolor(img,gray,cv_bgr2gray);//轉成單通道
mat dst;
mat corner_img;//存放檢測後的角點檢測
cornerharris(gray,corner_img,2,3,0,04);//harris角點檢測
imshow("corner",corner_img);
threshold(corner_img,dst,0.005,255,cv_thresh_binary);
imshow("dst",dst);
int rownumber=gray.rows;//獲取行數
int colnumber=gray.cols;//獲取每一行的元素
cout
(i,j)==255)
}imshow("result",result);
waitkey(0);
}3)shi-tomasi角點檢測–goodfeaturestotrack()
shi-tomasi演算法是harris演算法的改進,harris演算法最原始的定義是將矩陣m的行列式值與m的跡相減,再將差值同預先給定的閾值進行比較,後來shi和tomasi提供改進的方法,若兩個特徵值中較小的乙個大於最小閾值,則會得到強角點
void goodfeaturestotrack(inputarray image,outputarray corners,int maxcorners,double qualitylevel,double mindistance,inputarray mask=noarray(),int blocksize=3,bool useharrisdetector=false,double k=0.04)
&&image:輸入影象,需為8位或32位浮點型別的單通道影象
&&corners:檢測的角點的輸出向量
&&maxcorners:角點的最大數量
&&qualitylevel:角點檢測可接受的最小特徵值,實際用於過濾角點的最小特徵是qualitylevel和影象中最大特徵值得乘積,所有qualitylevel一般不超過1(通常取0.10或者0.01)
&&mindistance:角點之間的最小距離,此引數用於保證返貨的角點之間的距離不小於mindistance個畫素
&&mask:可選引數,表示就感興趣區域的掩碼用於指定角點檢測區域
&&blocksize:預設值3,是計算導數自相關矩陣時指定的鄰域範圍
&&useharrisdetctor:預設值false,指定是否使用harris角點檢測
&&k:預設值0.04用於設定heaaian自相關矩陣行列式的相對權重的權重係數
count<<"角點數量"
}imshow("result",result);
waitkey(0);4)亞畫素角點檢測——-cornersubpix()
如果我們進行影象處理的目的不是提取用於之別的特徵點,而是進行幾何測量,通常需要更高的精度,而前面的角點檢測方法都只能提供畫素點座標,但是有時候需要更高的精度比如亞畫素(浮點座標)精度,亞畫素級角點檢測在攝像機標定,三維結構重建方面是乙個基本的測量值
void cornersubpix(inputarray image,inputoutarray corners,size winsize,size zerozone,termcriteria criteria);
&&image:輸入影象
&&corners:提供輸入角點初始座標和精確的輸出座標
&&winsize:搜尋視窗的一半尺寸,若winsize=(5,5),那麼表示使用(5*2+1)*(5*2+1)=11*11大小的搜尋視窗
&&zerozone:表示死區的一半尺寸,值為(-1,-1)表示沒有死區
&&criteris:termcriteria型別,表示求角點的迭代過程的終止條件,即角點位置的確定,cirteria可以是最大迭代數目,或者是設定的精度,也可以是他們的組合
<<"角點數量"
<<"畫素座標;("
<","
<")"
<5,scalar(0,255,0),2,8);
}imshow("result",result);
size winsize=size(5,5);
size zerozone=size(-1,-1);
//最大迭代數目或精度其中乙個達到
termcriteris criteria=termcriteria(cv_termcrit_eps+cv_thetmcrit_iter,40,0.001);
cornersubpix(gray,cornerswinsize,zerozone,criteria);
for(int j=0;jcout
<<"亞畫素座標:("
<","
<")"
<5,scalar(0,255,0),-1,8);
}imshow("subpix",img);
waitkey(0);
opencv角點檢測
什麼叫角點呢?如果某一點在任意方向的乙個微小變化都會造成影象灰度很大的變化,那麼這個點就是角點 我們可以把角落看成是角點的現實體現,對於牆角來說,牆角是所有平面的開始點,只要這個點變化,就會引起所有從這個點出發的平面的變化,這就是角點。下面是幾個角點的具體描述 1 一階導數,也就是影象灰度的梯度的區...
OpenCV角點檢測小結
棋盤點匹配的問題?不考慮,因為r,t對內參標定沒影響。固定取左上角為原點就行了。注意 靶標是以什麼為單位無所謂,反正求出的內參是以畫素為單位的,t的單位和靶標單位一致。劉博確實很強大,均衡化後巧妙的統計得到了理想的門限,對光照相當魯棒!影象處理是一門藝術。opencv角點檢測小結 1,cvgoodf...
OpenCV 角點檢測(C )
1 opencv harris角點檢測方法cornerharris void cornerharris inputarray src,輸入8bit單通道灰度mat矩陣 outputarray dst,用於儲存harris角點檢測結果 int blocksize,滑塊視窗的尺寸 int ksize,s...