文档章节

opencv MSER(最大极值稳定区域)

moki_oschina
 moki_oschina
发布于 2016/11/24 11:36
字数 819
阅读 183
收藏 3

最大极值稳定区域,是一种类似分水岭图像的分割与匹配算法。它具有SIFT SURF及 ORB等特征不具备的仿射不变性,近年来广泛应用于图像分割与匹配领域。

详细算法原理介绍可参见链接   http://blog.csdn.net/zhaocj/article/details/40742191

创建MSER类

//开发环境 vs2013+opencv3.1.0
// 创建MSER对象
cv::Ptr<cv::MSER> mesr1 = cv::MSER::create(2, 10, 5000, 0.5, 0.3);
//如果想要了解各参数的含义,首先需要通过以上链接了解算法原理。2表示灰度值的变化量,10和5000表示检测到的组块面积的范围,0.5为最大的变化率,0.3为稳定区域的最小变换量

申明输出参数

std::vector<std::vector<cv::Point> > regContours;
std::vector<cv::Rect> bboxes1;

MSER检测

mesr1->detectRegions(gray, regContours, bboxes1);//gray为处理的图像,为单通道灰度图

保存检测到的结果

cv::Mat mserMapMat =cv::Mat::zeros(gray.size(), CV_8UC1);
for (int i = (int)regContours.size() - 1; i >= 0; i--)
	{
		// 根据检测区域点生成mser+结果
		const std::vector<cv::Point>& r = regContours[i];
		for (int j = 0; j < (int)r.size(); j++)
		{
			cv::Point pt = r[j];
			mserMapMat.at<unsigned char>(pt) = 255;
		}
	}

MSER根据需要检测的白色区域和黑色区域,又分为MSER+和MSER-

下面贴上Mser车牌目标检测示例 完整的C++代码   示例图片可到

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/features2d.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
// Mser车牌目标检测
std::vector<cv::Rect> mserGetPlate(cv::Mat srcImage)
{
	// HSV空间转换
	cv::Mat gray, gray_neg;
	cv::Mat hsi;
	cv::cvtColor(srcImage, hsi, CV_BGR2HSV);
	// 通道分离
	std::vector<cv::Mat> channels;
	cv::split(hsi, channels);
	// 提取h通道
	gray = channels[1];
	// 灰度转换 
	cv::cvtColor(srcImage, gray, CV_BGR2GRAY);
	// 取反值灰度
	gray_neg = 255 - gray;
	std::vector<std::vector<cv::Point> > regContours;
	std::vector<std::vector<cv::Point> > charContours;

	// 创建MSER对象
	cv::Ptr<cv::MSER> mesr1 = cv::MSER::create(2, 10, 5000, 0.5, 0.3);
	cv::Ptr<cv::MSER> mesr2 = cv::MSER::create(2, 2, 400, 0.1, 0.3);


	std::vector<cv::Rect> bboxes1;
	std::vector<cv::Rect> bboxes2;
	// MSER+ 检测
	mesr1->detectRegions(gray, regContours, bboxes1);
	// MSER-操作
	mesr2->detectRegions(gray_neg, charContours, bboxes2);

	cv::Mat mserMapMat =cv::Mat::zeros(srcImage.size(), CV_8UC1);
	cv::Mat mserNegMapMat =cv::Mat::zeros(srcImage.size(), CV_8UC1);

	for (int i = (int)regContours.size() - 1; i >= 0; i--)
	{
		// 根据检测区域点生成mser+结果
		const std::vector<cv::Point>& r = regContours[i];
		for (int j = 0; j < (int)r.size(); j++)
		{
			cv::Point pt = r[j];
			mserMapMat.at<unsigned char>(pt) = 255;
		}
	}
	// MSER- 检测
	for (int i = (int)charContours.size() - 1; i >= 0; i--)
	{
		// 根据检测区域点生成mser-结果
		const std::vector<cv::Point>& r = charContours[i];
		for (int j = 0; j < (int)r.size(); j++)
		{
			cv::Point pt = r[j];
			mserNegMapMat.at<unsigned char>(pt) = 255;
		}
	}
	// mser结果输出
	cv::Mat mserResMat;
	// mser+与mser-位与操作
	mserResMat = mserMapMat & mserNegMapMat;
	cv::imshow("mserMapMat", mserMapMat);
	cv::imshow("mserNegMapMat", mserNegMapMat);
	cv::imshow("mserResMat", mserResMat);
	// 闭操作连接缝隙
	cv::Mat mserClosedMat;
	cv::morphologyEx(mserResMat, mserClosedMat,
		cv::MORPH_CLOSE, cv::Mat::ones(1, 20, CV_8UC1));
	cv::imshow("mserClosedMat", mserClosedMat);
	// 寻找外部轮廓
	std::vector<std::vector<cv::Point> > plate_contours;
	cv::findContours(mserClosedMat, plate_contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));
	// 候选车牌区域判断输出
	std::vector<cv::Rect> candidates;
	for (size_t i = 0; i != plate_contours.size(); ++i)
	{
		// 求解最小外界矩形
		cv::Rect rect = cv::boundingRect(plate_contours[i]);
		// 宽高比例
		double wh_ratio = rect.width / double(rect.height);
		// 不符合尺寸条件判断
		if (rect.height > 20 && wh_ratio > 4 && wh_ratio < 7)
			candidates.push_back(rect);
	}
	return  candidates;
}
int main()
{
	cv::Mat srcImage =
		cv::imread("car.jpg");
	if (srcImage.empty())
		return-1;
	cv::imshow("src Image", srcImage);
	// 候选车牌区域检测
	std::vector<cv::Rect> candidates;
	candidates = mserGetPlate(srcImage);
	// 车牌区域显示
	for (int i = 0; i < candidates.size(); ++i) 
	{
		cv::imshow("rect", srcImage(candidates[i]));
		cv::waitKey();
	}
	cv::waitKey(0);
	return 0;
}

 

 

 

 

 

 

 

本文转载自:http://blog.csdn.net/hust_bochu_xuchao/article/details/52230694

共有 人打赏支持
moki_oschina
粉丝 25
博文 191
码字总数 39962
作品 0
成都
程序员
私信 提问
OpenCV 3.1 发布,计算机视觉库

OpenCV 3.1 发布,此版本更新内容如下:此版本是 3.x 系列的第一个稳定版本,详细改进内容请看发行说明。 OpenCV 3.1 支持最新的 Windows 和 OS X 操作系统和最新的开发工具 (VS2015 和 Xcod...

oschina
2015/12/22
11.9K
8
OpenCV轻松进阶初级篇(一)安装OpenCV

OpenCV是什么? OpenCV是Open Source Computer Vision Library的缩写。Intel于1999年建立OpenCV项目,现在由Willow Garage提供支持。它是一个基于BSD许可证授权发行的跨平台计算机视觉库,可...

鉴客
2011/11/30
939
0
OpenCV各版本差异与演化,从1.x到4.0

博客:blog.shinelee.me | 博客园 | CSDN 写在前面 最近因项目需要,得把OpenCV捡起来,登录OpenCV官网,竟然发现release了4.0.0-beata版本,所以借此机会,查阅资料,了解下OpenCV各版本的差...

Mr-Lee
10/31
0
0
OpenCV 2.1新特性(中文版)

转载请注明出处,谢谢! // Author: HeartFly // 翻译的还不够完善,希望高手指点。有的地方不明白什么意思。 OpenCV 2.1基本上是OpenCV 2.0的稳定版,然而还有以下几个特征: >>> 总体改进 ...

heartfly
2010/07/07
0
1
Background Segment CNT

CNT简介 CNT算法是OpenCV Contrib 模块中的背景减除(Background segment)算法之一。相较于OpenCV提供的其他背景减 除算法,该算法具有运行速度快,检测精度高等优点。因此背景减除系列文章第...

_xy
08/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

day179-2018-12-16-英语流利阅读-待学习

《海王》:上映 7 天,票房突破 9 亿,DC 要翻身? Daniel 2018-12-16 1.今日导读 这部电影堪称“有《阿凡达》般的视觉奇观,《指环王》般的史诗质感,《夺宝奇兵》般的寻宝历险,《狮子王》...

飞鱼说编程
12分钟前
3
0
window下安装maven

1.下载软件包: 2.解压到当前的安装路径: D:\Maven3.5.3 3.添加环境变量: 新建一个名为:MAVEN_HOME 填写解压路径:D:\Maven3.5.3 打开path,添加:%MAVEN_HOME%\bin 确定即可。 4.验证环境...

狼王黄师傅
26分钟前
5
0
聊聊flink的FsCheckpointStorage

序 本文主要研究一下flink的FsCheckpointStorage CheckpointStorage flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/CheckpointStorage.java /** * CheckpointStor......

go4it
48分钟前
3
0
makefile 常用函数

Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员。今天我们来学习下makefile的常用函数。 《GNU make》h...

科陆李明
今天
20
0
Android 报错 Could not find com.android.tools.build:aapt2:3.2.1-4818971.

报错信息: Could not find com.android.tools.build:aapt2:3.2.1-4818971.Searched in the following locations: file:/C:/Users/96110/AppData/Local/Android/Sdk/extras/m2reposito......

lanyu96
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部