- 操作系统: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 设置或获取边缘模糊大小。
- void detectRegions(InputArray image, vector<vector >& msers, vector
代码示例
#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;
}