角点提取比较

该博客介绍了如何使用OpenCV的cornerHarris函数进行Harris角点检测。通过计算梯度、加权平均和响应值,检测图像中的角点,并通过非极大值抑制找到局部最大值。代码示例展示了从读取图像到显示角点的完整流程。Harris角点检测具有旋转不变性和稳定性,但缺乏尺度不变性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Harris角点

基本思想和原理

Harris角点检测基本方法解释,基于OpenCV的调用

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

对应参数说明

Parameters

src
Input single-channel 8-bit or floating-point image.

dst
Image to store the results. It has the same size as src and the type CV_32FC(6) .

blockSize
Neighborhood size (see details below).

ksize
Aperture parameter for the Sobel operator.

borderType
Pixel extrapolation method. See #BorderTypes. #BORDER_WRAP is not supported.

实际案例,代码如下:


#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
using namespace std;

int main(){
    const string filename = "/home/wpf/Test/study_cpp/ICP/2.jpeg";
    const string filename1 = "/home/wpf/Test/study_cpp/ICP/img_1.png";
    cv::Mat image_se = cv::imread(filename1,cv::IMREAD_COLOR);
    if(!image_se.data){
        cout<<"image not found!"<<endl;
    }
    //获得灰度图
    cv::Mat image_se_gray;
    cv::cvtColor(image_se,image_se_gray,cv::COLOR_BGR2GRAY);
    cv::Mat harris;
    int blockSize = 2;
    int apertureSize = 3;
    //参数说明
    /**blockSize,窗口大小,一般为2
     * ksize sobel算子,计算梯度信息,通常为3或者5
     * k权重系数,一般为0.02-0.04
     * borderType一般使用默认值即可
     *
     * */
    cv::cornerHarris(image_se_gray,harris,blockSize,apertureSize,0.04);
    //归一化
    cv::Mat Harrisen;
    cv::normalize(harris,Harrisen,0,255,cv::NORM_MINMAX);
    cv::convertScaleAbs(Harrisen,Harrisen);

    //寻找角点
    vector<cv::KeyPoint> KeyPoints;
    for (int row = 0; row < Harrisen.rows; ++row) {
        for (int col  = 0; col < Harrisen.cols; ++col) {
            int R = Harrisen.at<uchar>(row,col);
            if(R>125){
                cv::KeyPoint keyPoint;
                keyPoint.pt.y = row;
                keyPoint.pt.x = col;
                KeyPoints.push_back(keyPoint);
            }
        }
    }
    //绘制结果
    cv::drawKeypoints(image_se,KeyPoints,image_se);
    cv::imshow("系数矩阵",Harrisen);
    cv::imshow("角点",image_se);
    cv::waitKey(0);
    return 0;
}

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

分析源码:

基本步骤

  1. 计算两个方向上的梯度
  2. 计算两个方向上的梯度乘积
  3. 使用高斯函数进行加权平均
  4. 计算Harris的响应值,小于某一阈值置零
  5. 非极大值抑制,取局部最大值

优缺点分析

优点:计算简单,特征点提取均匀且稳定,(具有图像旋转不变性,亮度不变,视点不变性)

缺点:没有尺度不变性,角点是像素级级别,需要设计对应的描述子和匹配算法

参考资料:

  1. Harris基本原理
  2. Harris原理详解
  3. 相关参考
  4. 基本原理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值