編程環(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,IxIy進行濾波,或用全一窗口
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
2内狗、第二組分辨率:240*319
3、第三組:340*256(翻轉)
4义锥、第四組:480*316
小結:
????????通過對上訴幾組圖片結果的觀察發(fā)現(xiàn)柳沙,其中Shi-Tomasi的效果應該是最好的,角點標記的很全面拌倍,而且沒有像Harris那樣閾值很難調節(jié)赂鲤,對不同圖片變化很大(使用高斯的閾值大概為10^12很大!)柱恤,而Fast得有點就在于簡單速度快数初,但是精準不夠,opencv庫內的Harris角點檢測個人感覺很難用梗顺,閾值很難調泡孩,而且可能是為了不檢測出錯,檢測出來的角點數(shù)量比較少寺谤,效果不是很好仑鸥。