OpenCV探索之路(十五):角点检测

角点检测是计算机视觉系统中用来获取图像特征的一种方法。我们都常说,这幅图像很有特点,但是一问他到底有哪些特点,或者这幅图有哪些特征可以让你一下子就识别出该物体,你可能就说不出来了。其实说图像的特征,你可以尝试说一下这幅图有几个矩形啊几个圆形啊,有几条直线啊,当然啦,你也可以说一下有几个角点。

什么是角点?

角点通常被定义为两条边的交点。比如,三角形有三个角,矩形有四个角,这些就是角点,也是他们叫做矩形、三角形的特征,我们看到一些几何图形具有三个角,那么我们便可以脱口而出说这是一个三角形。

上面所说的是严格意义上的角点,但是从广义来说,角点指的是拥有特定特征的图像点,这些特征点在图像中有具体的坐标,并具有某些数学特征(比如局部最大或最小的灰度)。

图像特征类型可以被分为三种:

  • 边缘
  • 角点(感兴趣关键点)
  • 斑点(感兴趣区域)

角点是个很特殊的存在。如果某一点在任意方向的一个微小的变动都会引起灰度很大的变化,那么我们就可以把该点看做是角点。

Harris 角点检测

Harris角点检测是一种直接基于灰度图的角点提取算法,稳定性高,尤其对L型角点(也就是直角)检测精度高。缺点也是明显的,就是运算速度慢。

OpenCV使用的相应函数是

void cornerHarris( InputArray src, OutputArray dst, int blockSize,int ksize,
                    double k, int borderType = BORDER_DEFAULT );

下面给出相应的检测代码。

#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"  

using namespace cv;
using namespace std;

Mat g_srcImage, g_srcImage1, g_grayImage;
int thresh = 30; //当前阈值
int max_thresh = 175; //最大阈值  

void on_CornerHarris(int, void*);//回调函数  

int main(int argc, char** argv)
{
    g_srcImage = imread("lol19.jpg", 1);
    if (!g_srcImage.data)
    {
        printf("读取图片错误! \n");
        return -1;
    }
    imshow("原始图", g_srcImage);
    g_srcImage1 = g_srcImage.clone();

    //存留一张灰度图
    cvtColor(g_srcImage1, g_grayImage, CV_BGR2GRAY);

    //创建窗口和滚动条
    namedWindow("角点检测", CV_WINDOW_AUTOSIZE);
    createTrackbar("阈值: ", "角点检测", &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_srcImage1 = g_srcImage.clone();

    //进行角点检测
    //第三个参数表示邻域大小,第四个参数表示Sobel算子孔径大小,第五个参数表示Harris参数
    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 j = 0; j < normImage.rows; j++)
    {
        for (int i = 0; i < normImage.cols; i++)
        {
            //Mat::at<float>(j,i)获取像素值,并与阈值比较
            if ((int)normImage.at<float>(j, i) > thresh + 80)
            {
                circle(g_srcImage1, 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("角点检测", g_srcImage1);
    imshow("角点检测2", scaledImage);

}

先看看原始图

开始检测,我把阈值设为30,检测到角点还挺多的。

我把阈值进一步提高,角点变少了。认真观察一下,是不是检测到的点都是一些亮度明显变化的临界点?比如由黑变白的边界点。

Shi-Tomasi角点检测

除了上述的Harris角点检测方法,我们还可以采用Shi-Tomasi方法进行角点检测。Shi-Tomsi算法是Harris算法的加强版,性能当然也有相应的提高。

#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 maxCorners = 23;
int maxTrackbar = 100;

RNG rng(12345);  //RNG:random number generator,随机数产生器
char* source_window = "Image";

void goodFeaturesToTrack_Demo(int, void*);

int main()
{
    //转化为灰度图
    src = imread("lol19.jpg", 1);
    cvtColor(src, src_gray, CV_BGR2GRAY);

    namedWindow(source_window, CV_WINDOW_AUTOSIZE);

    //创建trackbar
    createTrackbar("MaxCorners:", source_window, &maxCorners, maxTrackbar, goodFeaturesToTrack_Demo);

    imshow(source_window, src);

    goodFeaturesToTrack_Demo(0, 0);

    waitKey(0);
    return(0);
}

void goodFeaturesToTrack_Demo(int, void*)
{
    if (maxCorners < 1) { maxCorners = 1; }

    //初始化 Shi-Tomasi algorithm的一些参数
    vector<Point2f> corners;
    double qualityLevel = 0.01;
    double minDistance = 10;
    int blockSize = 3;
    bool useHarrisDetector = false;
    double k = 0.04;

    //给原图做一次备份
    Mat copy;
    copy = src.clone();

    // 角点检测
    goodFeaturesToTrack(src_gray,corners,maxCorners,qualityLevel,minDistance,Mat(),blockSize,useHarrisDetector,k);

    //画出检测到的角点
    cout << "** Number of corners detected: " << corners.size() << endl;
    int r = 4;
    for (int i = 0; i < corners.size(); i++)
    {
        circle(copy, corners[i], r, Scalar(rng.uniform(0, 255), rng.uniform(0, 255),
            rng.uniform(0, 255)), -1, 8, 0);
    }

    namedWindow(source_window, CV_WINDOW_AUTOSIZE);
    imshow(source_window, copy);
}

时间: 2024-09-29 09:20:25

OpenCV探索之路(十五):角点检测的相关文章

Opencv学习笔记--Harris角点检测

image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/7391511 文章目录: 一.Harris角点检测基本理论 二.opencv代码实现 三.改进的Harris角点检测 四.FAST角点检测 五.参考文献 六.附录(资料和源码) 一.Harris角点检测基本理论(要讲清楚东西太多,附录提供文档详细说明) 1.1 简略表达: 角点:最直观的印象就是在水平

OpenCV探索之路(五):图片缩放和图像金字塔

对图像进行缩放的最简单方法当然是调用resize函数啦! resize函数可以将源图像精确地转化为指定尺寸的目标图像. 要缩小图像,一般推荐使用CV_INETR_AREA来插值:若要放大图像,推荐使用CV_INTER_LINEAR. 现在说说调用方式 第一种,规定好你要图片的尺寸,就是你填入你要的图片的长和高. #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using namespace std

Opencv 亚像素级别角点检测

Size winSize = Size(5,5); Size zerozone = Size(-1,-1); TermCriteria tc = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001); cornerSubPix(img_gray1, vec_points, winSize, zerozone, tc); 原文地址:https://www.cnblogs.com/herd/p/9742018.html

【opencv入门】角点检测之Harris角点检测

一.引言:关于兴趣点(interest points) 在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪.三维重建等一系列的问题.我们不再观察整幅图,而是选择某些特殊的点,然后对他们进行局部有的放矢的分析.如果能检测到足够多的这种点,同时他们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就有使用价值. 图像特征类型可以被分为如下三种: <

33、【opencv入门】角点检测之Harris角点检测

一.引言:关于兴趣点(interest points) 在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪.三维重建等一系列的问题.我们不再观察整幅图,而是选择某些特殊的点,然后对他们进行局部有的放矢的分析.如果能检测到足够多的这种点,同时他们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就有使用价值. 图像特征类型可以被分为如下三种: <

OpenCV角点检测源代码分析(Harris和ShiTomasi角点)

OpenCV中常用的角点检测为Harris角点和ShiTomasi角点. 以OpenCV源代码文件 .\opencv\sources\samples\cpp\tutorial_code\TrackingMotion\cornerDetector_Demo.cpp为例,主要分析其中的这两种角点检测源代码.角点检测数学原理请参考我之前转载的一篇博客 http://www.cnblogs.com/riddick/p/7645904.html,分析的很详细,不再赘述.本文主要分析其源代码: 1. Har

15、角点检测之Harris角点检测

一.引言:关于兴趣点(interest points) 在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪.三维重建等一系列的问题.我们不再观察整幅图,而是选择某些特殊的点,然后对他们进行局部有的放矢的分析.如果能检测到足够多的这种点,同时他们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就有使用价值. 图像特征类型可以被分为如下三种: <

openCV2马拉松第19圈——Harris角点检测(自己实现)

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/26824529 收入囊中 使用OpenCV的connerHarris实现角点检测 自己实现Harris算法 下面是自己实现的一个效果图 因为阀值设置比较高,所以房屋周围没有找出来 葵花宝典 在此之前,我们讲过边缘的检测,边缘检测的基本原理就是x方向或者y方向梯度变化很大,角点,顾名思义,就是两个方向的梯度变化都很大. 左1,平滑区域,没有边缘和角点

第十一节、Harris角点检测原理

OpenCV可以检测图像的主要特征,然后提取这些特征.使其成为图像描述符,这类似于人的眼睛和大脑.这些图像特征可作为图像搜索的数据库.此外,人们可以利用这些关键点将图像拼接起来,组成一个更大的图像,比如将许多图像放在一块,然后形成一个360度全景图像. 这里我们将学习使用OpenCV来检测图像特征,并利用这些特征进行图像匹配和搜索.我们会选取一些图像,并通过单应性,检测这些图像是否在另一张图像中. 一 特征检测算法 有许多用于特征检测和提取的算法,我们将会对其中大部分进行介绍.OpenCV最常使