Bootstrap

OpenCV2D 特征框架 (2) 特征检测与描述的类cv::AKAZE的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::AKAZE 是 OpenCV 库中用于特征检测和描述的类,它实现了 AKAZE(Accelerated-KAZE)算法。AKAZE 是 KAZE 特征检测器的一个加速版本,旨在提供更快的速度同时保持对尺度和旋转变化的良好不变性。以下是 cv::AKAZE 类的一些关键特性和使用方法。

关键特性
加速:相比于原始的 KAZE 算法,AKAZE 通过优化计算过程提高了处理速度。
多尺度检测:能够在多个尺度上检测特征点,以捕捉不同大小的对象或结构。
仿射不变性:对图像的缩放、旋转等变换具有良好的不变性。
非极大值抑制:可以启用或禁用非极大值抑制来控制检测到的关键点数量。
描述符类型选择:支持多种描述符类型,包括二进制描述符(如 MLDB)和浮点数描述符(如 KAZE 描述符)。
创建 cv::AKAZE 对象
你可以通过以下方式创建一个 cv::AKAZE 检测器对象:

#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>

int main()
{
    // 使用默认参数创建 AKAZE 检测器
    cv::Ptr<cv::AKAZE> detector = cv::AKAZE::create();

    // 或者指定更详细的参数
    detector = cv::AKAZE::create(
        cv::AKAZE::DESCRIPTOR_KAZE,  // 描述符类型
        0,                           // 描述符通道数,默认为0表示自动选择
        3,                           // 阈值,默认值是0.001
        4,                           // nOctaves,金字塔层数,默认值是4
        2,                           // nOctaveLayers,每层的子层数,默认值是4
        cv::KAZE::DIFF_PM_G2         // 扩散类型,默认值是DIFF_PM_G2
    );

    return 0;
}

枚举成员说明

  • DESCRIPTOR_KAZE:使用 KAZE 浮点数描述符。
  • DESCRIPTOR_MLDB:使用 MLDB 二进制描述符。
  • DIFF_PM_G1, DIFF_PM_G2, DIFF_WEICKERT, DIFF_CHARBONNIER:不同的扩散类型,影响特征点的检测过程。

代码示例

#include <opencv2/features2d.hpp>
#include <opencv2/opencv.hpp>

int main()
{
    // 加载图像(请确保路径正确)
    cv::Mat image = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/left.jpg", cv::IMREAD_GRAYSCALE );
    if ( image.empty() )
    {
        std::cerr << "无法打开或找到图像!" << std::endl;
        return -1;
    }

    // 创建 AKAZE 特征检测器,默认参数
    cv::Ptr< cv::AKAZE > detector = cv::AKAZE::create();

    // 也可以指定更详细的参数
    /*
    detector = cv::AKAZE::create(
        cv::AKAZE::DESCRIPTOR_MLDB, // 描述符类型:MLDB二进制描述符
        0,                          // 描述符通道数,默认为0表示自动选择
        0.001f,                     // 阈值,默认值是0.001
        4,                          // nOctaves,金字塔层数,默认值是4
        4,                          // nOctaveLayers,每层的子层数,默认值是4
        cv::KAZE::DIFF_PM_G2        // 扩散类型,默认值是DIFF_PM_G2
    );
    */

    // 检测特征点
    std::vector< cv::KeyPoint > keypoints;
    detector->detect( image, keypoints );

    // 计算描述符
    cv::Mat descriptors;
    detector->compute( image, keypoints, descriptors );

    // 打印检测到的特征点数量和描述符大小
    std::cout << "Detected keypoints: " << keypoints.size() << std::endl;
    std::cout << "Descriptors size: " << descriptors.rows << " x " << descriptors.cols << std::endl;

    // 可视化结果
    cv::Mat outputImage;
    cv::drawKeypoints( image, keypoints, outputImage, cv::Scalar::all( -1 ), cv::DrawMatchesFlags::DEFAULT );

    // 显示结果图像
    cv::imshow( "Detected Keypoints", outputImage );
    cv::waitKey( 0 );  // 等待按键事件

    return 0;
}

运行结果

在这里插入图片描述

;