OpenCV2.4.4实现Harris角点检测

来源:互联网 发布:mac地址定位上网位置 编辑:程序博客网 时间:2024/06/05 02:18
#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace cv;using namespace std;//全局变量Mat src, src_gray;//源图和灰度图int thresh = 200;//默认阈值int max_thresh = 255;//滑块条最大值void cornerHarris_demo( int, void* ){    Mat dst, dst_norm, dst_norm_scaled;    dst = Mat::zeros( src.size(), CV_32FC1 );    //参数    int blockSize = 2;    int apertureSize = 3;    double k = 0.04;    //Harris角点检测    cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );    //像素归一化到[0,255]    normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );    convertScaleAbs( dst_norm, dst_norm_scaled );//去绝对值后变换为8位无符号类型    Mat src_copy = src.clone();    //在角点上画圈    for( int j = 0; j < dst_norm.rows ; j++ )    {        for( int i = 0; i < dst_norm.cols; i++ )        {            if( (int) dst_norm.at<float>(j,i) > thresh )            {                circle(dst_norm_scaled,Point(i,j),3,Scalar(0));                circle(src_copy,Point(i,j),3,Scalar(0,255,0));            }        }    }    /// Showing the result    namedWindow( "Corners", CV_WINDOW_AUTOSIZE );    imshow( "Corners", dst_norm_scaled );    imshow( "Src", src_copy );}int main(){    //加载源图像并转换为灰度图    src = imread("horse.jpg");    cvtColor( src, src_gray, CV_BGR2GRAY );    //显示源图    namedWindow( "Src", CV_WINDOW_AUTOSIZE );    imshow( "Src", src );    //创建滑块条,并指定回调函数为cornerHarris_demo(),每次滑块位置改变时都会调用此函数    createTrackbar( "阈值:", "Src", &thresh, max_thresh, cornerHarris_demo );    //调用函数,计算角点    cornerHarris_demo( 0, 0 );    waitKey(0);    return(0);}

效果图: