Opencv3从头开始(十)Harris角点检测

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表示直接读取灰度图像。
效果如下:

在这里插入图片描述
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章