CV進階操作【8】——Harris角點檢測C++實現(xiàn)

編程環(huán)境:

VS + OpenCV + C++
完整代碼已經(jīng)更新至GitHub,歡迎fork~GitHub鏈接


聲明:創(chuàng)作不易,未經(jīng)授權不得復制轉載
statement:No reprinting without authorization


內容概述:

  • Harris角點檢測:實現(xiàn)Harris角點檢測算法,并與OpenCV的cornerHarris函數(shù)的結果進行比較。

一、角點檢測相關介紹

1尝哆、經(jīng)典的Harris角點檢測

基本算法步驟:

1.利用Soble計算出XY方向的梯度值得到Ix和Iy
2.計算出Ix2,Iy2,IxIy
3.(可選)利用高斯函數(shù)對Ix2,Iy2,Ix
Iy進行濾波,或用全一窗口
4.計算局部特征結果矩陣M的特征值和響應函數(shù)的值
R(i,j)=Det(M)-k(trace(M))^2 (0.04<=k<=0.06)
5.將計算出響應函數(shù)的值C進行局部極大值抑制,濾除一些不是角點的點亩歹,防止重疊,同時要滿足大于設定的閾值

2凡橱、改進的Shi-Tomasi角點檢測

(1) 經(jīng)典的Harris角點檢測方法不難看出小作,該算法的穩(wěn)定性和k有關,而k是個經(jīng)驗值稼钩,不好把握顾稀,浮動也有可能較大。鑒于此坝撑,改進的Harris方法()直接計算出兩個特征值静秆,通過比較兩個特征值直接分類,這樣就不用計算Harris響應函數(shù)了巡李。
(2) 另一方面抚笔,我們不再用非極大值抑制了,而選取容忍距離,容忍距離內只有一個特征點:該算法首先選取一個具有最大最小特征值(把每個harris矩陣的最小特征值作為其衡量击儡,認為其更有代表性)的點(即:max(min(e1塔沃,e2)),e1,e2是harris矩陣的特征值)作為角點蛀柴,然后依次按照最大最小特征值順序尋找余下的角點螃概,當然和前一角點距離在容忍距離內的新角點被忽略,防止重疊鸽疾。
在opencv中的實現(xiàn)為:goodFeatureTrack()

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 );

3吊洼、FAST角點檢測算法
????????該算法檢測的角點定義為在像素點的周圍鄰域內有足夠多的像素點與該點處于不同的區(qū)域。應用到灰度圖像中制肮,即有足夠多的像素點的灰度值大于該點的灰度值或者小于該點的灰度值,便是角點冒窍。算法原理比較簡單,但實時性很強豺鼻。
????????Eg:若某像素點圓形鄰域圓周上有3/4的點和該像素點不同(編程時不超過某閾值th)综液,則認為該點就是候選角點。(這一思路可以使用機器學習的方法進行加速儒飒。對同一類圖像谬莹,例如同一場景的圖像,可以在16個方向上進行訓練桩了,得到一棵決策樹附帽,從而在判定某一像素點是否為角點時,不再需要對所有方向進行檢測井誉,而只需要按照決策樹指定的方向進行2-3次判定即可確定該點是否為角點蕉扮。)
????????和Harris算法類似,該算法需要非極大值抑制颗圣。
????????補充:SUSAN 提取算子
????????基本原理是喳钟,與每一圖像點相關的局部區(qū)域具有相同的亮度。如果某一窗口區(qū)域內的每一像元亮度值與該窗口中心的像元亮度值相同或相似欠啤,這一窗口區(qū)域將被稱之為“USAN”荚藻。計算圖像每一像元的“USAN”,為我們提供了是否有邊緣的方法洁段。位于邊緣上的像元的“USAN”較杏τ(像素值一般是連續(xù)變化的),位于角點上的像元的“USAN”更小祠丝。因此疾呻,我們僅需尋找最小的“USAN”,就可確定角點写半。該方法由于不需要計算圖像灰度差岸蜗,因此,具有很強的抗噪聲的能力叠蝇。
????????Fast在opencv中的實現(xiàn):FastFeatureDetector fast(參數(shù)列表);

    //示例代碼
    Mat  image, image1 = cv::imread ("test.jpg");
    cv::cvtColor (image1,image,CV_BGR2GRAY);
    //快速角點檢測
    std::vector<cv::KeyPoint> keypoints;
    cv::FastFeatureDetector fast(40,true);
    fast .detect (image,keypoints);
    drawKeypoints(image,keypoints,image,cv::Scalar::all(255),cv::DrawMatchesFlags::DRAW_OVER_OUTIMG);

二璃岳、具體Harris角點檢測實現(xiàn)介紹

1、圖像的梯度計算:
直接調用opencv的sobel算子進行濾波:

Ix:Sobel(img, dst, CV_64FC1, 0, 1, 3);
Iy:Sobel(img, dst, CV_64FC1, 1, 0, 3);

2、Ixx铃慷、Iyy单芜、Ixy的計算及局部特征結果矩陣M的特征值和響應函數(shù)的值:
????????通過第一步的大的Ix和Iy,分別遍歷對應元素值進行相乘得到新的所需Mat犁柜,針對是否進行高斯的濾波(使用opencv庫函數(shù) GaussianBlur)洲鸠,設計兩個計算的函數(shù)接口:

Gauss: Mat computeImage(Mat& ixx, Mat& iyy, Mat& ixy, int wsize);
NoGauss: Mat computeImage(Mat& ix, Mat& iy, int wsize, int para);

兩種的Harris檢測主要框架代碼如下:

//使用全一的窗口函數(shù)
void myHarrisCorner_ave(Mat &srcImg) {
    Mat image,src_grayImg,Ix,Iy,I_xx,I_yy,I_xy,R,filter_R,result;
    cvtColor(srcImg, src_grayImg, COLOR_BGR2GRAY);
    image = srcImg.clone();
    
    int wsize = 3;//窗口大小
    sobelGradient(src_grayImg, Ix,1);
    sobelGradient(src_grayImg,Iy, 2);
    I_xx = computeImage(Ix, Iy, wsize, 1);
    I_yy = computeImage(Ix, Iy, wsize, 2);
    I_xy = computeImage(Ix, Iy, wsize, 4);
    //計算響應值
R = computeImage(Ix, Iy, wsize, 3);
//局部非極大值抑制
    filter_R = filterR(R, 10);
    mixP(filter_R, image, 2);
    imshow("Ave", image);
    imwrite("myHarris_Ave05.jpg", image);
}
//使用高斯平滑
void myHarrisCorner_Gauss(Mat &srcImg) {
    Mat image, src_grayImg, Ix, Iy, I_xx, I_yy, I_xy, R, filter_R, result;
    cvtColor(srcImg, src_grayImg, COLOR_BGR2GRAY);
    image = srcImg.clone();
    int wsize = 3;//窗口大小
    sobelGradient(src_grayImg, Ix, 1);
    sobelGradient(src_grayImg, Iy, 2);
    I_xx = computeImage(Ix, Iy, wsize, 1);
    GaussianBlur(I_xx, I_xx, Size(3, 3), 0, 0);
    I_yy = computeImage(Ix, Iy, wsize, 2);
    GaussianBlur(I_yy, I_yy, Size(3, 3), 0, 0);
    I_xy = computeImage(Ix, Iy, wsize, 4);
    GaussianBlur(I_xy, I_xy, Size(3, 3), 0, 0);
    //計算響應值
    R = computeImage(I_xx, I_yy,I_xy, wsize);
//局部非極大值抑制
    filter_R = filterR(R, 10);
    //顯示結果
    mixP(filter_R, image, 2);
    imshow("Gauss", image);
    imwrite("myHarris_gauss05.jpg", image);

三、四種方法的結果對比分析

????????對于opencv自帶的Harris角點檢測馋缅、改進的Shi-Tomasi角點檢測扒腕、FAST角點檢測算法、自己實現(xiàn)的Harri的使用高斯平滑以及不使用的五種輸入同樣的測試圖片結果如下萤悴,每一種都調好參數(shù)后便固定不變測試對于不同大小角度的圖片:(圖片順序為:①Fast瘾腰、②Harris(opencv)、③myHarris(noGauss)覆履、④myHarris(Gauss)居灯、⑤ST)

1、第一組分辨率:692*910
image.png
image.png

image.png
image.png

image.png
2内狗、第二組分辨率:240*319
image.png
image.png
image.png

image.png
image.png
3、第三組:340*256(翻轉)
image.png
image.png

image.png
image.png

image.png
4义锥、第四組:480*316
image.png

image.png

image.png

image.png

image.png

小結:

????????通過對上訴幾組圖片結果的觀察發(fā)現(xiàn)柳沙,其中Shi-Tomasi的效果應該是最好的,角點標記的很全面拌倍,而且沒有像Harris那樣閾值很難調節(jié)赂鲤,對不同圖片變化很大(使用高斯的閾值大概為10^12很大!)柱恤,而Fast得有點就在于簡單速度快数初,但是精準不夠,opencv庫內的Harris角點檢測個人感覺很難用梗顺,閾值很難調泡孩,而且可能是為了不檢測出錯,檢測出來的角點數(shù)量比較少寺谤,效果不是很好仑鸥。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市变屁,隨后出現(xiàn)的幾起案子眼俊,更是在濱河造成了極大的恐慌,老刑警劉巖粟关,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疮胖,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機澎灸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門院塞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人击孩,你說我怎么就攤上這事迫悠。” “怎么了巩梢?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵创泄,是天一觀的道長。 經(jīng)常有香客問我括蝠,道長鞠抑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任忌警,我火速辦了婚禮搁拙,結果婚禮上,老公的妹妹穿的比我還像新娘法绵。我一直安慰自己箕速,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布朋譬。 她就那樣靜靜地躺著盐茎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪徙赢。 梳的紋絲不亂的頭發(fā)上字柠,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音狡赐,去河邊找鬼窑业。 笑死,一個胖子當著我的面吹牛枕屉,可吹牛的內容都是我干的常柄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼搀擂,長吁一口氣:“原來是場噩夢啊……” “哼拐纱!你這毒婦竟也來了?” 一聲冷哼從身側響起哥倔,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤秸架,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咆蒿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體东抹,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡蚂子,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缭黔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片食茎。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖馏谨,靈堂內的尸體忽然破棺而出别渔,到底是詐尸還是另有隱情,我是刑警寧澤惧互,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布哎媚,位于F島的核電站,受9級特大地震影響喊儡,放射性物質發(fā)生泄漏拨与。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一艾猜、第九天 我趴在偏房一處隱蔽的房頂上張望买喧。 院中可真熱鬧,春花似錦匆赃、人聲如沸淤毛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钱床。三九已至,卻和暖如春埠居,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背事期。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工滥壕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兽泣。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓绎橘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親唠倦。 傳聞我的和親對象是個殘疾皇子称鳞,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內容