《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测
第10章 角點(diǎn)檢測(cè)
10.1 Harris角點(diǎn)檢測(cè)
10.1.1 角點(diǎn)
1.圖像特征類型:
(1)邊緣
(2)角點(diǎn)(感興趣點(diǎn))
(3)斑點(diǎn)(感興趣區(qū)域)
2.角點(diǎn)定義:
(1) 一階導(dǎo)數(shù)(灰度的梯度)的局部最大所對(duì)應(yīng)的像素點(diǎn)
(2)兩條及兩條以上邊緣的交點(diǎn)
(3)圖像中梯度值和梯度方向的變化速率都很高的點(diǎn)
(4)角點(diǎn)處的一階導(dǎo)數(shù)最大,二階導(dǎo)數(shù)為0,指示了物體邊緣變化不連續(xù)的方向
3.角點(diǎn)檢測(cè)算法:
(1)基于灰度圖像的角點(diǎn)檢測(cè)
??1)基于梯度
??2)基于模板
????考慮像素鄰域點(diǎn)的灰度變化,將與鄰域點(diǎn)亮度對(duì)比足夠大的點(diǎn)定義為角點(diǎn)
????常見算法:Kitchen-Rosenfeld角點(diǎn)檢測(cè)、Harris角點(diǎn)檢測(cè)、KLT角點(diǎn)檢測(cè)、SUSAN角點(diǎn)檢測(cè)
??3)基于模板梯度組合
(2)基于二值圖像的角點(diǎn)檢測(cè)
(3)基于輪廓曲線的角點(diǎn)檢測(cè)
10.1.2 harris角點(diǎn)檢測(cè)
1.作用:
??基于灰度圖像的角點(diǎn)提取算法,運(yùn)行Harris角點(diǎn)檢測(cè)算子進(jìn)行角點(diǎn)檢測(cè)
2.原理:
??和cornerMinEigenVal()以及cornerEigenValsAndVecs()函數(shù)類似,cornerHarris函數(shù)對(duì)于每一個(gè)像素(x,y)在blockSize*blockSize鄰域內(nèi),計(jì)算2*2梯度的協(xié)方差矩陣M(x,y),然后找出輸出圖中局部最大值,即找出角點(diǎn):
????????????????
3.函數(shù)原型:
void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, intborderType=BORDER_DEFAULT)
4.參數(shù)說(shuō)明:
(1)輸入圖像,單通道8位或浮點(diǎn)型圖像
(2)存放Harris角點(diǎn)檢測(cè)輸出結(jié)果,與原圖像一樣尺寸和類型
(3)鄰域大小
(4)Sobel()算子孔徑大小
(5)Harris參數(shù)
(6)圖像像素邊界模式,默認(rèn)BORDER_DEFAULT
10.1.3 示例程序
1.Harris角點(diǎn)檢測(cè)
#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);//進(jìn)行Harris角點(diǎn)檢測(cè)Mat cornerStrength;cornerHarris(srcImage, cornerStrength, 2, 3, 0.01);//對(duì)灰度圖進(jìn)行閾值操作,得到二值圖并顯示Mat harrisCorner;threshold(cornerStrength, harrisCorner, 0.00001, 255, THRESH_BINARY);imshow("【角點(diǎn)檢測(cè)后的二值效果圖】", harrisCorner);waitKey(0);return 0;
}
運(yùn)行效果:
2.Harris角點(diǎn)檢測(cè)與繪制
/*程序說(shuō)明:滑動(dòng)條調(diào)節(jié)閾值,以控制harris檢測(cè)角點(diǎn)數(shù)量
*/
#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;
//全局函數(shù)
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);//創(chuàng)建滑動(dòng)條并初始化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;//目標(biāo)圖Mat normImage;//歸一化圖Mat scaledImage;//線性變換后的八位無(wú)符號(hào)整型圖//初始化//置零當(dāng)前需要顯示的兩幅圖,即清除上一次調(diào)用此函數(shù)時(shí)的值dstImage = Mat::zeros(g_srcImage.size(), CV_32FC1);g_srcImage.copyTo(g_srcImage1);//角點(diǎn)檢測(cè)cornerHarris(g_grayImage, dstImage, 2, 3, 0.04, BORDER_DEFAULT);//歸一化與轉(zhuǎn)換normalize(dstImage, normImage, 0, 255, NORM_MINMAX, CV_32FC1, Mat());convertScaleAbs(normImage, scaledImage);//將歸一化后的圖線性變換成8位無(wú)符號(hào)整型//將檢測(cè)到的,符合閾值條件的角點(diǎn)繪制出來(lái)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);
}
運(yùn)行效果:
總結(jié)
以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 不孕症要做哪些检查
- 下一篇: 一缕朝阳下一句是什么呢?