Opencv3從頭開始(十)Harris角點檢測
如果某一點在任意方向的一個微小變動都會引起灰度很大的變化,那麼我們就把它稱之爲角點
cornerHarris 函數用於在OpenCV中運行Harris角點檢測算子處理圖像
/*
Harris角點檢測
*/
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
Mat gray_image;
Mat image;
int thresh = 0 ;
void on_CornerHarris( int, void* );
int main(int argc, char* argv[]){
image = imread("建築.jpeg");
//灰度
cvtColor(image,gray_image,COLOR_BGR2GRAY);
namedWindow( "展示", CV_WINDOW_AUTOSIZE );
createTrackbar( "閾值: ", "展示", &thresh, 175, on_CornerHarris );
on_CornerHarris( 0, 0 );
waitKey(0);
return 0;
}
//回調函數
void on_CornerHarris( int, void* ){
//定義角點
Mat image_1,dstImage,normImage,scaledImage;
dstImage = Mat::zeros( gray_image.size(), CV_32FC1 );
image_1=image.clone( );
cornerHarris(gray_image, dstImage, 2, 3, 0.01);
//歸一化與轉換
normalize( dstImage, normImage, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
//將歸一化後的圖線性變換成8位無符號整型
convertScaleAbs( normImage, scaledImage );
// 將檢測到的,且符合閾值條件的角點繪製出來
for( int j = 0; j < normImage.rows ; j++ )
{ for( int i = 0; i < normImage.cols; i++ )
{
if( (int) normImage.at<float>(j,i) > thresh+80 )
{
circle( image_1, Point( i, j ), 5, Scalar(10,10,255), 2, 8, 0 );
circle( scaledImage, Point( i, j ), 5, Scalar(0,10,255), 2, 8, 0 );
}
}
}
imshow("二值效果圖", scaledImage);
imshow("展示",image_1);
}
imread(“建築.jpeg”,0);
其中,imread->0表示直接讀取灰度圖像。
效果如下: