《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测
第10章 角點檢測
10.1 Harris角點檢測
10.1.1 角點
1.圖像特征類型:
(1)邊緣
(2)角點(感興趣點)
(3)斑點(感興趣區域)
2.角點定義:
(1) 一階導數(灰度的梯度)的局部最大所對應的像素點
(2)兩條及兩條以上邊緣的交點
(3)圖像中梯度值和梯度方向的變化速率都很高的點
(4)角點處的一階導數最大,二階導數為0,指示了物體邊緣變化不連續的方向
3.角點檢測算法:
(1)基于灰度圖像的角點檢測
??1)基于梯度
??2)基于模板
????考慮像素鄰域點的灰度變化,將與鄰域點亮度對比足夠大的點定義為角點
????常見算法:Kitchen-Rosenfeld角點檢測、Harris角點檢測、KLT角點檢測、SUSAN角點檢測
??3)基于模板梯度組合
(2)基于二值圖像的角點檢測
(3)基于輪廓曲線的角點檢測
10.1.2 harris角點檢測
1.作用:
??基于灰度圖像的角點提取算法,運行Harris角點檢測算子進行角點檢測
2.原理:
??和cornerMinEigenVal()以及cornerEigenValsAndVecs()函數類似,cornerHarris函數對于每一個像素(x,y)在blockSize*blockSize鄰域內,計算2*2梯度的協方差矩陣M(x,y),然后找出輸出圖中局部最大值,即找出角點:
????????????????
3.函數原型:
void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, intborderType=BORDER_DEFAULT)
4.參數說明:
(1)輸入圖像,單通道8位或浮點型圖像
(2)存放Harris角點檢測輸出結果,與原圖像一樣尺寸和類型
(3)鄰域大小
(4)Sobel()算子孔徑大小
(5)Harris參數
(6)圖像像素邊界模式,默認BORDER_DEFAULT
10.1.3 示例程序
1.Harris角點檢測
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{//載入灰度圖像并顯示Mat srcImage = imread("1.jpg", 0);imshow("【原始圖】", srcImage);//進行Harris角點檢測Mat cornerStrength;cornerHarris(srcImage, cornerStrength, 2, 3, 0.01);//對灰度圖進行閾值操作,得到二值圖并顯示Mat harrisCorner;threshold(cornerStrength, harrisCorner, 0.00001, 255, THRESH_BINARY);imshow("【角點檢測后的二值效果圖】", harrisCorner);waitKey(0);return 0;
}
運行效果:
2.Harris角點檢測與繪制
/*程序說明:滑動條調節閾值,以控制harris檢測角點數量
*/
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//定義輔助宏
#define WINDOW_NAME1 "【原始圖窗口】"
#define WINDOW_NAME2 "【程序窗口1】"
#define WINDOW_NAME3 "【程序窗口2】"
//全局變量
Mat g_srcImage, g_srcImage1, g_grayImage;
int thresh = 30;
int max_thresh = 175;
//全局函數
void on_CornerHarris(int, void*);
int main()
{//載入原圖g_srcImage = imread("1.jpg");if (!g_srcImage.data){printf("載入原圖失敗~!\n");return false;}imshow(WINDOW_NAME1, g_srcImage);g_srcImage.copyTo(g_srcImage1);cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);//創建滑動條并初始化namedWindow(WINDOW_NAME2, WINDOW_AUTOSIZE);createTrackbar("閾值:", WINDOW_NAME2, &thresh, max_thresh, on_CornerHarris);on_CornerHarris(0, 0);waitKey(0);return 0;
}
void on_CornerHarris(int, void*)
{//局部變量Mat dstImage;//目標圖Mat normImage;//歸一化圖Mat scaledImage;//線性變換后的八位無符號整型圖//初始化//置零當前需要顯示的兩幅圖,即清除上一次調用此函數時的值dstImage = Mat::zeros(g_srcImage.size(), CV_32FC1);g_srcImage.copyTo(g_srcImage1);//角點檢測cornerHarris(g_grayImage, dstImage, 2, 3, 0.04, BORDER_DEFAULT);//歸一化與轉換normalize(dstImage, normImage, 0, 255, NORM_MINMAX, CV_32FC1, Mat());convertScaleAbs(normImage, scaledImage);//將歸一化后的圖線性變換成8位無符號整型//將檢測到的,符合閾值條件的角點繪制出來for (int i = 0; i < normImage.rows; i++){for (int j = 0; j < normImage.cols; j++){if ((int)normImage.at<float>(i, j) > thresh + 80){circle(g_srcImage1, Point(j, i), 5, Scalar(10, 10, 255), 2, 8, 0);circle(scaledImage, Point(j, i), 5, Scalar(0, 10, 255), 2, 8, 0);}}}imshow(WINDOW_NAME2, g_srcImage1);imshow(WINDOW_NAME3, scaledImage);
}
運行效果:
總結
以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不孕症要做哪些检查
- 下一篇: 《OpenCV3编程入门》学习笔记10