文档章节

opencv-车牌区域提取

moki_oschina
 moki_oschina
发布于 2016/11/24 11:04
字数 454
阅读 78
收藏 4
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/features2d/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::MSER(2, 10, 5000, 0.5, 0.3)(gray, regContours);
	// MSER-操作
	cv::MSER(2, 2, 400, 0.1, 0.3)(gray_neg, charContours);
	cv::Mat mserMapMat = 
		cv::Mat::zeros(srcImage.size(), CV_8UC1);
	cv::Mat mserNegMapMat = 
		cv::Mat::zeros(srcImage.size(), CV_8UC1);
	// MSER+ 检测
	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;
	// 候选车牌区域检测
	std::vector<cv::Rect> candidates;
	candidates = mserGetPlate(srcImage);
	// 车牌区域显示
	for (int i = 0; i < candidates.size(); ++i) {
		cv::imshow("rect", srcImage(candidates[i]));
		cv::waitKey();
	}
	return 0;
}

原图

效果图

http://lib.csdn.NET/base/OpenCV

本文转载自:http://blog.csdn.net/hb707934728/article/details/51895634

共有 人打赏支持
moki_oschina
粉丝 25
博文 191
码字总数 39962
作品 0
成都
程序员
私信 提问
软件运行问题,点击1车牌定位时出错

@oschina 你好,想跟你请教个问题:最近下载了您的车牌识别源代码,经过编译生成exe文件后,运行到第二步车牌定位,车牌识别时出错,错误是opencv:assertion failed((scn==3||scn==4)&&(dept...

清澈不见底
2015/08/16
163
0
关于 opencv 训练LBP联级分类器的一点总结

最近需要做一个联级分类器来定位图像中的目标(用车牌定位来做例子),于是选用opencv的LBP算法。关于介绍,这篇博文写的还可以 点击打开链接 实现的时候查找其他博客也遇到了很多问题,我用...

evinxu
04/13
0
0
使用OpenCV通过摄像头捕获实时视频并探测人脸

在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,视频可以看作是一帧一帧的图片,因此图片操作其实是视频操作的基础,这篇手记就来讲讲OpenCV中的视频操作,并实现一...

种子_fe
08/16
0
0
C++ 程序使用 OpenCV 实现视频捕获

下载 Capture.zip - 14.1 KB 前言 这是一个使用 Visual C++ 窗口表单编写的简单视频捕捉应用程序。这个工程既演示了窗口表单应用程序的创建,又演示了 OpenCV 的 Visual C++ 配置。 OpenCV 是...

oschina
2014/03/10
8.5K
6
OpenCV轻松进阶初级篇(一)安装OpenCV

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

鉴客
2011/11/30
939
0

没有更多内容

加载失败,请刷新页面

加载更多

全屋WiFi彻底无死角 这才是终极解决方案

无线网络现在不仅在家庭中不可或缺,在酒店、医院、学校等场景中的需求也越来越多。尤其是这些场景中,房间多但也需要每个房间都能够完美覆盖WiFi,传统的吸顶式AP就无法很好的解决问题。 H3...

linux-tao
24分钟前
0
0
Python日期字符串比较

需要用python的脚本来快速检测一个文件内的二个时间日期字符串的大小,其实实现很简单,首先一些基础的日期格式化知识如下 复制代码 %a星期的简写。如 星期三为Web %A星期的全写。如 星期三为...

dragon_tech
24分钟前
0
0
ORA 各种oraclesql错误

ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某...

青峰Jun19er
28分钟前
2
0
没错,老板让我写个 BUG!

前言 标题没有看错,真的是让我写个 bug! 刚接到这个需求时我内心没有丝毫波澜,甚至还有点激动。这可是我特长啊;终于可以光明正大的写 bug 了🙄。 先来看看具体是要干啥吧,其实主要就是...

crossoverJie
41分钟前
54
0
开源软件会被云杀死吗 ?

本文转载云头条,原作者:Michael Stiefel是Reliable Software公司的负责人,是一名软件架构和开发顾问。 文章要点 虽然开源开发不会消失,但商业开源厂商的未来不是很有希望。随着全面管理的...

linuxCool
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部