OpenCV2D 特征框架 (8)特征检测与描述检测稳定极值区域的类cv::MSER的使用

发布于:2025-02-10 ⋅ 阅读:(46) ⋅ 点赞:(0)
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::MSER(Maximally Stable Extremal Regions)是 OpenCV 库中用于检测稳定极值区域的类。MSER 算法旨在找到那些在连续尺度空间变化过程中,其面积和形状保持相对稳定的区域。这些区域通常对应于图像中的显著结构或物体,并且对于尺度变换具有一定的不变性,因此在计算机视觉任务中非常有用,如特征匹配、目标识别和跟踪等。

以下是 cv::MSER 类的一些关键成员函数和属性:

  • 构造函数:
    • cv::MSER::MSER() 默认构造函数。
    • cv::MSER::MSER(int _delta=1, int _min_area=60, int _max_area=14400, double _max_variation=0.25, double _min_diversity=.2, int _max_evolution=200, double _area_threshold=1.01, double _min_margin=0.003, int _edge_blur_size=5) 构造函数允许设置 MSER 检测器的各种参数。
  • 成员函数:
    • void detectRegions(InputArray image, vector<vector >& msers, vector & bboxes) const 在输入图像中检测 MSER 区域,并返回区域的点集列表和每个区域对应的边界框。
    • void setDelta(int delta) 和 int getDelta() const 设置或获取每次迭代时灰度阈值的变化量。
    • void setMinArea(int minArea) 和 int getMinArea() const 设置或获取最小区域面积。
    • void setMaxArea(int maxArea) 和 int getMaxArea() const 设置或获取最大区域面积。
    • void setPass2Only(bool pass2only) 和 bool getPass2Only() const 设置或获取是否仅使用第二阶段进行检测。
    • void setMaxVariation(double maxVariation) 和 double getMaxVariation() const 设置或获取最大变异系数,用来过滤形状变化过大的区域。
    • void setMinDiversity(double minDiversity) 和 double getMinDiversity() const 设置或获取最小多样性,用来过滤相似度太高的区域。
    • void setMaxEvolution(int maxEvolution) 和 int getMaxEvolution() const 设置或获取最大演化次数。
    • void setAreaThreshold(double areaThreshold) 和 double getAreaThreshold() const 设置或获取面积阈值。
    • void setMinMargin(double minMargin) 和 double getMinMargin() const 设置或获取最小边缘比例。
    • void setEdgeBlurSize(int edgeBlurSize) 和 int getEdgeBlurSize() const 设置或获取边缘模糊大小。

代码示例

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

using namespace cv;
using namespace std;


int main()
{
    // 加载图像并转换为灰度图
    Mat image = imread( "/media/dingxin/data/study/OpenCV/sources/images/right.jpg", IMREAD_GRAYSCALE );
    if ( image.empty() )
    {
        std::cout << "Could not open or find the image" << std::endl;
        return -1;
    }

    // 创建 MSER 检测器
    Ptr< MSER > mser = MSER::create();

    // 存储检测到的 MSER 区域及其边界框
    vector< vector< Point > > msers;
    vector< Rect > bboxes;

    // 检测 MSER 区域
    mser->detectRegions( image, msers, bboxes );

    // 绘制边界框并显示
    Mat outputImage = Mat::zeros( image.size(), CV_8UC3 );
    for ( size_t i = 0; i < bboxes.size(); ++i )
    {
        rectangle( outputImage, bboxes[ i ], Scalar( 255, 0, 0 ), 2, LINE_8 );
    }

    imshow( "original images", image );
    imshow( "MSER Regions", outputImage );
    waitKey( 0 );

    return 0;
}

运行结果

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到