OpenCV使用边缘提取、腐蚀、轮廓进行车牌定位
http://blog.csdn.net/superdont/article/details/24935383
版权声明:本文为博主原创文章,未经博主允许不得转载。
采用OpenCV249利用边缘检测、轮廓检测、腐蚀实现的车牌定位,具体为:
- Mat srcImage=imread("image/000.jpg");
- //imshow("a",srcImage);
- int i,j;
- int cPointR,cPointG,cPointB,cPoint;//currentPoint;
- Mat resizeImage;
- resize(srcImage,resizeImage,Size(400,300));
- Mat grayImage;
- cvtColor(resizeImage,grayImage, CV_BGR2GRAY);
- Mat medianImage;
- medianBlur(grayImage,medianImage,3); //最后一个参数需要为奇数
- Mat sobelImage;
- //参数为:源图像,结果图像,图像深度,x方向阶数,y方向阶数,核的大小,尺度因子,增加的值
- Sobel(medianImage,sobelImage,CV_8U,1,0,3,0.4,128);
- Mat normalizeImage;
- normalize(sobelImage,normalizeImage,255,0,CV_MINMAX);
- Mat binaryImage;
- threshold(normalizeImage,binaryImage, 100, 255, THRESH_BINARY_INV );
- Mat closeImage;
- //morphologyEx(binaryImage,closeImage,MORPH_CLOSE,Mat(3,1,CV_8U),Point(0,0),10); //闭运算
- Mat openImage(closeImage.rows,closeImage.cols,CV_8UC1);
- //morphologyEx(closeImage,openImage,MORPH_OPEN,Mat(3,3,CV_8U),Point(0,0),1); //开运算
- // erode(openImage,openImage,Mat(3,3,CV_8U),Point(-1,-1),10);
- dilate(binaryImage,openImage,Mat(3,3,CV_8U),Point(-1,-1),6);
- /*
- Mat rgbImage;
- cvtColor(openImage,rgbImage, CV_GRAY2BGR);
- */
- //cvtColor(openImage,openImage, CV_BGR2GRAY);
- //vector<vector<Point> > contours;
- //vector<Vec4i> hierarchy;
- //openImage=imread("test.png");
- imshow("openImage",openImage);
- /// Detect edges using canny
- // Canny( src_gray, canny_output, thresh, thresh*2, 3 );
- /// Find contours
- /* Mat thresholdImage;
- cvtColor(openImage,openImage, CV_BGR2GRAY);
- threshold( openImage,thresholdImage,127, 255, THRESH_BINARY );
- openImage=thresholdImage;*/
- vector<vector<Point> > contours;
- vector<Vec4i> hierarchy;
- findContours(openImage, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
- Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
- for( int i = 0; i < contours.size(); i++ )
- {
- //使用边界框的方式
- CvRect aRect = boundingRect(contours[i]);
- int tmparea=aRect.height*aRect.height;
- if (((double)aRect.width/(double)aRect.height>2)&& ((double)aRect.width/(double)aRect.height<6)&& tmparea>=200&&tmparea<=25000)
- {
- rectangle(resizeImage,cvPoint(aRect.x,aRect.y),cvPoint(aRect.x+aRect.width ,aRect.y+aRect.height),color,2);
- //cvDrawContours( dst, contours, color, color, -1, 1, 8 );
- }
- }
- imshow("contour",resizeImage);
效果一般,部分测试图像:
测试了很多图片,这几张基本有个样子,通过调整腐蚀的次数,可以针对不同的图像进行定位。
参考资料:
学习OpenCV——车牌检测(定位):http://blog.csdn.net/yangtrees/article/details/7444470
OpenCV使用边缘提取、腐蚀、轮廓进行车牌定位的更多相关文章
- 车牌定位与畸变校正(python3.7,opencv4.0)
一.前言及思路简析 目前车牌识别系统在各小区门口随处可见,识别效果貌似都还可以.查阅资料后,发现整个过程又可以细化为车牌定位.畸变校正.车牌分割和内容识别四部分.本篇随笔主要介绍车牌定位及畸变校正两部 ...
- EasyPR--开发详解(2)车牌定位
这篇文章是一个系列中的第三篇.前两篇的地址贴下:介绍.详解1.我撰写这系列文章的目的是:1.普及车牌识别中相关的技术与知识点:2.帮助开发者了解EasyPR的实现细节:3.增进沟通. EasyPR的项 ...
- EasyPR源码剖析(4):车牌定位之Sobel算子定位
一.简介 sobel算子主要是用于获得数字图像的一阶梯度,常见的应用是边缘检测. Ⅰ.水平变化: 将 I 与一个奇数大小的内核进行卷积.比如,当内核大小为3时, 的计算结果为: Ⅱ.垂直变化: 将: ...
- 车牌识别LPR(四)-- 车牌定位
第四篇:车牌定位 车牌定位就是采用一系列图像处理或者数学的方法从一幅图像中将车牌准确地定位出来.车牌定位提取出的车牌是整个车牌识别系统的数据来源,它的效果的好坏直接影响到整个系统的表现,只有准确地定位 ...
- EasyPR源码剖析(2):车牌定位
上一篇主要介绍了车牌识别的整体框架和流程,车牌识别主要划分为了两个过程:即车牌检测和字符识别,而车牌识别的核心环节就是这一节主要介绍的车牌定位,即 Plate Locate.车牌定位主要是将图片中有可 ...
- 基于matlab的蓝色车牌定位与识别---识别
接着昨天的工作,把最后一部分识别讲完. 关于字符识别这块,一种最省事的办法是匹配识别,将所得的字符和自己的标准字符库相减,计算所得结果,值最小的即为识别的结果.不过这种方法是在所得字符较为标准的情况, ...
- 【原】基于matlab的蓝色车牌定位与识别---绪论
本着对车牌比较感兴趣,自己在课余时间摸索关于车牌的定位与识别,现将自己所做的一些内容整理下,也方便和大家交流. 考虑到车牌的定位涉及到许多外界的因素,因此有必要对车牌照的获取条件进行一些限定: 一.大 ...
- python-opencv实现简单的车牌定位
车牌定位的原理:https://blog.csdn.net/relocy/article/details/78705662 训练好的分类器:https://github.com/zeusees/Hyp ...
- OpenCV函数:提取轮廓相关函数使用方法
opencv中提供findContours()函数来寻找图像中物体的轮廓,并结合drawContours()函数将找到的轮廓绘制出.首先看一下findContours(),opencv中提供了两种定义 ...
随机推荐
- C# 常用接口学习 IEnumerable<T>
作者:乌龙哈里 时间:2015-10-24 平台:Window7 64bit,Visual Studio Community 2015 本文参考: MSDN IEnumerable<T> ...
- xcode6+ios8 横屏下启动画面不显示问题修改
本文转载自汉果博客 » xcode6+ios8 横屏下启动画面不显示问题修改 最近我做游戏 发现xcode6+ios8 横屏下启动画面不显示 显示黑屏 . 设置横屏后 设置catalog 添加使用 ...
- Strusts2--课程笔记8
文件的和上传和下载: (1)文件的上传: Struts是通过拦截器实现文件上传的,而默认拦截器栈中包含了文件上传拦截器,故表单通过Struts2可直接将文件上传,其底层是通过apache的common ...
- python+selenium+Eclipse安装
1.安装python 参考安装python:http://www.cnblogs.com/beyongblue/p/4215740.html 2.安装python管理工具setuptools 3.安装 ...
- Oracle杀死死锁进程
查杀系统死锁的sql,最近想改造成存储过程,如下: CREATE OR REPLACE PROCEDURE HERO_KILLLOCKSESSION (OUT_COUNT OUT NUMBER, OU ...
- 通用mapper的使用
通用mapper的使用 导入依赖 <dependency> <groupId>com.github.abel533</groupId> <artifactId ...
- Java 集合 集合与数组之间的转换
Java 集合 集合与数组之间的转换 @author ixenos 数组转集合 Arrays.asList(T... a) 先给结论:用 Arrays.asList(T... a) 将数组转换成集合 ...
- 3、Hibernate三态间的转换
学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别 ...
- Union、Union All、Except、InterSect的区别
UNION: 将多个「结果集 (result set)」的「行 (row)」合并,作为单个结果集返回,并移除重复的行.若有重复的行,只留下一个. UNION ALL: 将多个「结果集 (result ...
- openwrt增加串口登录需要密码
https://wiki.openwrt.org/doc/howto/serial.console.password Openwrt 串口默认是没有密码的.Openwrt启动后,一个默认的密码将被启用 ...