OpenCV下车牌定位算法实现代码
毕业设计基于python和opencv的车牌识别

毕业设计基于python和opencv的车牌识别摘要:本篇文章介绍了基于Python和OpenCV的车牌识别技术,并详细讨论了车牌识别系统的原理、实现步骤和效果评估。
通过该系统,可以准确地识别出图像中的车牌信息,实现了对车辆的自动监测和管理。
该系统具有较高的准确率和实用性,可以在实际场景中广泛应用。
1. 前言车牌识别技术是计算机视觉领域中的重要研究方向之一。
随着交通运输的发展和车辆数量的增加,对车辆的管理和监测需求日益增加。
传统的车牌识别方法需要大量的人工干预和复杂的算法,效果受到诸多因素的影响。
而基于Python和OpenCV的车牌识别技术能够更加高效、准确地实现车牌的自动识别,为车辆管理提供了更好的支持。
2. 车牌识别系统的原理车牌识别系统的原理基于图像处理和机器学习技术。
首先,通过摄像机获取车辆图像,并使用图像处理技术进行预处理。
对图像进行灰度化、二值化、图像增强等处理,以提高图像质量和车牌的辨识度。
然后,使用基于机器学习的方法对处理后的图像进行特征提取和分类。
通过训练模型,将车牌区域与其他区域进行区分,并提取出车牌的特征信息。
最后,通过字符分割和字符识别技术对车牌上的字符进行提取和识别。
车牌识别系统的准确性取决于算法的优化和模型的训练效果。
3. 车牌识别系统的实现步骤基于Python和OpenCV的车牌识别系统的实现步骤分为图像预处理、特征提取与分类、字符分割和字符识别四个主要步骤。
3.1 图像预处理首先,将获取的车辆图像转换为灰度图像,并对其进行二值化处理。
通过设定合适的阈值,将车牌区域与其他区域进行区分。
然后,进行图像增强处理,包括对比度调整、边缘增强等,以提高车牌的辨识度。
最后,使用形态学操作对图像进行开运算和闭运算,去除噪声和细小的干扰。
3.2 特征提取与分类在图像预处理之后,需要对处理后的图像进行特征提取和分类。
可以使用机器学习算法,如支持向量机(SVM)、卷积神经网络(CNN)等,对车牌区域与其他区域进行分类。
车牌识别(附源代码)

车牌识别电子1301 孙洪江 2013234020113一、目的与要求车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。
通过设计实现车牌识别系统,能够提高学生分析问题和解决问题的能力,还能培养一定的科研能力二、设计原理:牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。
其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。
某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。
一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。
当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。
牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。
三、详细设计步骤:为了进行牌照识别,需要以下几个基本的步骤:a.牌照定位,定位图片中的牌照位置;b.牌照字符分割,把牌照中的字符分割出来;c.牌照字符识别,把分割好的字符进行识别,最终组成牌照号码。
牌照识别过程中,牌照颜色的识别依据算法不同,可能在上述不同步骤实现,通常与牌照识别互相配合、互相验证。
(1)牌照定位:自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定牌照区域是整个识别过程的关键。
首先对采集到的视频图像进行大范围相关搜索,找到符合汽车牌照特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为牌照区域,并将其从图象中分割出来。
(2)牌照字符分割 :完成牌照区域的定位后,再将牌照区域分割成单个字符,然后进行识别。
字符分割一般采用垂直投影法。
由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值的附近,并且这个位置应满足牌照的字符书写格式、字符、尺寸限制和一些其他条件。
基于opencv的车牌识别的代码

基于opencv的车牌识别的代码车牌识别是计算机视觉领域的一个重要应用,它可以通过图像处理和模式识别技术,自动识别出车辆的车牌号码。
OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和机器学习算法,非常适合用于车牌识别的开发。
下面是一个基于OpenCV的车牌识别的代码示例:```pythonimport cv2import numpy as np# 加载车牌识别模型plate_cascade =cv2.CascadeClassifier('haarcascade_russian_plate_number.xml') # 加载车牌字符识别模型char_cascade =cv2.CascadeClassifier('haarcascade_russian_plate_number_char.xml') # 读取图像img = cv2.imread('car.jpg')# 转换为灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测车牌plates = plate_cascade.detectMultiScale(gray, 1.1, 4)# 遍历每个车牌for (x, y, w, h) in plates:# 绘制车牌区域cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)# 提取车牌区域plate = gray[y:y+h, x:x+w]# 检测车牌字符chars = char_cascade.detectMultiScale(plate, 1.1, 4)# 遍历每个字符for (cx, cy, cw, ch) in chars:# 绘制字符区域cv2.rectangle(img, (x+cx, y+cy), (x+cx+cw, y+cy+ch), (0, 255, 0), 2)# 提取字符区域char = plate[cy:cy+ch, cx:cx+cw]# 进行字符识别# ...# 在这里可以使用机器学习或深度学习算法对字符进行识别# 显示结果图像cv2.imshow('License Plate Recognition', img)cv2.waitKey(0)cv2.destroyAllWindows()```在这个代码示例中,首先我们加载了车牌识别模型和车牌字符识别模型。
如何使用Matlab技术进行车牌识别

如何使用Matlab技术进行车牌识别车牌识别技术是一种在现代交通管理、安保等领域应用广泛的技术。
通过使用Matlab软件,我们可以轻松实现车牌识别功能。
本文将介绍如何使用Matlab技术进行车牌识别。
一、图像预处理在进行车牌识别之前,首先需要对图像进行预处理。
图像预处理的目的是提取车牌信息并减小噪声干扰。
在Matlab中,我们可以使用一系列图像处理函数来实现图像预处理,包括图像二值化、边缘检测、形态学操作等。
这些函数可以帮助我们提取车牌轮廓,并去除背景和噪声。
二、车牌定位车牌定位是车牌识别的关键步骤之一。
通过车牌定位,我们可以找到图像中的车牌区域,并将其与其他区域进行区分。
在Matlab中,可以使用图像分割、形态学滤波等技术来实现车牌定位。
这些技术可以帮助我们提取车牌的形状、颜色和纹理等特征,并将其与其他区域进行区分。
三、字符分割一旦我们成功地定位了车牌区域,就需要将车牌中的字符进行分割。
字符分割是车牌识别中的一个重要环节。
通过将车牌中的字符进行分割,我们可以得到单个字符的图像,为后续的字符识别做准备。
在Matlab中,可以使用一系列图像处理函数来实现字符分割,包括边缘检测、连通性分析和投影分析等。
这些函数可以帮助我们将车牌中的字符与其他区域进行分离。
四、字符识别字符识别是车牌识别的核心任务。
通过对字符进行识别,我们可以得到车牌中的文本信息。
在Matlab中,可以使用模式识别、神经网络或者深度学习等技术来实现字符识别。
这些技术可以帮助我们训练一个分类器,将字符图像与对应的字符进行匹配。
通过匹配算法,我们可以得到车牌的文本信息。
五、车牌识别结果展示在进行车牌识别之后,我们可以将识别结果进行展示。
通过将识别结果与原始图像进行对比,我们可以验证车牌识别的准确性。
在Matlab中,可以使用图像绘制函数和文本显示函数来实现车牌识别结果的展示。
通过这些函数,我们可以在原始图像中标注出识别结果,并将结果显示在图像上。
OpenCV在智能车牌识别系统中的应用研究

OpenCV在智能车牌识别系统中的应用研究一、智能车牌识别系统的概念和应用现状智能车牌识别系统是一种基于计算机视觉和图像处理技术的智能化交通管理系统,通过对车辆车牌图像进行识别和分析,实现对车辆的自动识别、追踪和管理。
该系统可以广泛应用于停车场管理、交通违章监测、高速公路收费、安防监控等领域,为城市交通管理和安全监控提供了重要的技术支持。
目前,智能车牌识别系统在实际应用中已取得了一定的成果。
停车场管理系统可以通过智能车牌识别系统自动识别车辆并进行停车场入口控制和计费管理;交通违章监测系统可以通过智能车牌识别系统实现对违章车辆的自动抓拍和追踪;高速公路收费系统可以通过智能车牌识别系统实现对车辆的自动通行费用扣费。
智能车牌识别系统已经成为现代城市交通管理和安全监控的重要组成部分。
OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法,为智能车牌识别系统的实现提供了强大的技术支持。
在智能车牌识别系统中,OpenCV可以应用于车牌图像的获取、预处理、识别和分析等方面,具体应用包括以下几个方面:1. 车牌图像的获取智能车牌识别系统首先需要获取车辆的车牌图像。
OpenCV可以应用于图像采集设备的接口,例如摄像头和摄像头模块,实现对车牌图像的实时采集和获取。
通过OpenCV提供的图像处理函数和接口,可以实现对车牌图像的高效获取和存储,为后续的车牌识别和分析提供了基础数据支持。
车牌图像的预处理是智能车牌识别系统中的重要环节。
OpenCV提供了丰富的图像处理函数和算法,可以应用于车牌图像的灰度化、二值化、滤波处理、边缘检测、形态学处理等方面,实现对车牌图像的预处理和增强。
通过OpenCV提供的图像处理技术,可以有效地消除车牌图像中的噪声和干扰,提高车牌识别的准确度和鲁棒性。
python 实现判断车牌归属地的步骤流程

python 实现判断车牌归属地的步骤流程判断车牌归属地的步骤流程如下:1. 收集车牌号码:从用户输入、文本文件或其他数据源中获取车牌号码。
2. 验证车牌号码格式:使用正则表达式或其他方式验证车牌号码是否符合规定的格式。
3. 获取车牌号码前缀:根据车牌号码格式,提取出车牌号码的前缀部分,一般代表车牌归属地的信息。
4. 加载归属地数据:从数据库、CSV文件或其它数据源中加载车牌归属地信息数据。
5. 匹配归属地:根据车牌号码的前缀,与加载的归属地数据进行匹配,得到匹配的归属地信息。
6. 显示归属地信息:将匹配的归属地信息显示给用户。
可以输出到控制台、保存到文件或展示在界面上。
以下是一个简单的Python代码示例,演示了如何实现判断车牌归属地的功能:```pythonimport reimport csv# 验证车牌号码格式def validate_license_plate(license_plate):pattern = r'^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使]{1}[A-Z]{1}[A-Z_0-9]{6}$'return re.match(pattern, license_plate)# 获取车牌号码前缀def get_license_prefix(license_plate):return license_plate[:2]# 加载归属地数据def load_location_data(file_path):location_data = {}with open(file_path, 'r') as file:csv_reader = csv.reader(file)for row in csv_reader:license_prefix = row[0]location = row[1]location_data[license_prefix] = locationreturn location_data# 匹配归属地def match_location(license_prefix, location_data):return location_data.get(license_prefix)# 主程序def main():license_plate = input("请输入车牌号码:")# 验证车牌号码格式if not validate_license_plate(license_plate):print("车牌号码格式错误!")return# 获取车牌号码前缀license_prefix = get_license_prefix(license_plate)# 加载归属地数据location_data = load_location_data('location_data.csv')# 匹配归属地location = match_location(license_prefix, location_data)# 显示归属地信息if location:print("车牌归属地:", location)else:print("未找到匹配的归属地信息!")if __name__ == "__main__":main()```以上示例代码中使用了正则表达式验证车牌号码格式,使用csv模块加载车牌归属地数据。
车牌识别测试报告

车牌识别测试报告1. 背景介绍车牌识别技术是一种通过计算机视觉技术对车辆的车牌进行自动识别的技术。
它广泛应用于交通管理、停车场管理、安防监控等领域。
本文将对车牌识别系统进行测试,并给出详细的测试报告。
2. 测试环境车牌识别系统的测试环境如下: - 操作系统:Windows 10 - 开发工具:Python 3.7 - 相机设备:USB摄像头3. 测试步骤步骤一:安装依赖库车牌识别系统的运行需要依赖一些Python库,如OpenCV、Numpy等。
在测试前,首先需要确保这些库已经正确安装。
步骤二:获取测试样本为了测试车牌识别系统的准确性和鲁棒性,我们从不同场景中收集了一些包含车牌的图片作为测试样本。
这些样本包括不同角度、不同光照条件下的车牌图片。
步骤三:预处理图片在进行车牌识别前,需要对测试样本进行一些预处理操作,以增加识别的准确性。
预处理步骤包括图像去噪、图像增强等。
步骤四:车牌定位车牌定位是车牌识别的第一步,在该步骤中,系统需要识别出图像中的车牌位置。
我们使用基于边缘检测和形态学运算的方法进行车牌定位。
步骤五:字符分割在车牌定位的基础上,需要对车牌进行字符分割,将车牌中的字符分离出来。
字符分割算法通常包括基于投影法、基于连通性等方法。
步骤六:字符识别在字符分割后,将得到单个字符的图像,然后使用字符识别算法对这些字符进行识别。
字符识别算法可以采用传统的机器学习方法,也可以使用深度学习方法。
步骤七:识别结果验证通过对测试样本的处理和识别,得到了识别结果。
为了验证系统的准确性,我们将人工判断识别结果与实际车牌进行比对。
4. 测试结果经过对车牌识别系统的测试,我们得到了如下结果: - 在正常光照条件下,系统的准确率达到了90%以上; - 在光照不均匀或夜间光照条件下,系统的准确率略有下降,但仍能保持在80%以上; - 对于车牌被遮挡或者倾斜的情况,系统的准确率会有所降低。
5. 总结与改进车牌识别系统在本次测试中表现出了较高的准确性和鲁棒性。
毕业设计pythonopencv实现车牌识别颜色定位

千万别去找颜色相近的!!!!!!Leabharlann 感觉挺好的,至少看得见一块。
我们稍微做下预处理开闭操作,把这白色区域糊成一块,哈哈哈哈,还行
Matrix = np.ones((20, 20), np.uint8) img_edge1 = cv2.morphologyEx(output, cv2.MORPH_CLOSE, Matrix) img_edge2 = cv2.morphologyEx(img_edge1, cv2.MORPH_OPEN, Matrix)
颜色过滤一下~
hsv = cv2.cvtColor(filename, cv2.COLOR_BGR2HSV) mask_blue = cv2.inRange(hsv, lower_blue, upper_blue) mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow) output = cv2.bitwise_and(hsv, hsv, mask=mask_blue+mask_yellow) # 根据阈值找到对应颜色 output = cv2.cvtColor(output, cv2.COLOR_BGR2GRAY)
毕业设计 pythonopencv实现车牌识别颜色定位
我们发现有些图片根本就是胡乱定位的,原因在于预处理没有搞好而已,如果不想动预处理的代码的话,我们就换一个方法。 这是我找了很久的黄色和蓝色的大概范围
lower_blue = np.array([100, 110, 110]) upper_blue = np.array([130, 255, 255]) lower_yellow = np.array([15, 55, 55]) upper_yellow = np.array([50, 255, 255])
车牌识别实验报告

车牌识别实验报告1. 引言车牌识别是计算机视觉领域中一项重要的任务,它可以应用于交通管理、车辆追踪、智能停车等多个领域。
本实验旨在使用计算机视觉技术实现车牌识别,并评估不同方法在车牌识别任务上的性能。
2. 方法与实验设置2.1 数据集本实验使用了包含X张车辆图片的数据集,其中每张图片都带有车牌。
数据集中的车牌来自不同地区,包括不同字母和数字的组合。
2.2 数据预处理在进行车牌识别之前,需要对数据进行一定的预处理。
我们采取了以下步骤来准备数据:2.2.1 图像裁剪首先,我们利用图像处理技术对每张图片进行裁剪,截取出车牌区域。
由于车牌的位置和大小可能会有所不同,因此需要使用特定的算法来进行车牌区域的定位和提取。
2.2.2 图像增强为了提高图像中车牌的可分辨性,我们对裁剪后的车牌图像进行了增强处理。
常见的增强方法包括对比度增强、直方图均衡化和图像清晰化等。
通过这些增强技术,我们可以增强车牌图像的边缘和文字信息,从而更好地进行后续的识别。
2.3 特征提取与分类在车牌识别中,我们需要提取图像中的特征,并将其输入到分类器中进行识别。
常用的特征提取方法包括颜色直方图、梯度方向直方图和局部二值模式等。
在本实验中,我们选择了梯度方向直方图作为特征,并使用支持向量机(SVM)作为分类器进行车牌识别。
3. 实验结果与分析3.1 评估指标在对车牌进行识别后,我们需要评估识别的准确率和性能。
常用的评估指标包括精确度(Precision)、召回率(Recall)和F1值等。
3.2 实验结果根据实验设置,我们对数据集进行了训练和测试,并使用评估指标来评估车牌识别模型的性能。
经过多次实验和交叉验证,我们得到了如下结果:方法精确度召回率F1值方法A 0.85 0.82 0.83方法B 0.92 0.88 0.90方法C 0.95 0.93 0.943.3 分析与讨论根据实验结果,我们可以发现方法C在车牌识别任务中的性能最好,具有最高的精确度、召回率和F1值。
基于 OpenCV 和 Python 车牌识别系统的设计与实现代码大全

题目基于OpenCV和Python车牌识别系统的设计与实现1.1 题目的主要研究内容(1)工作的主要描述利用python中自带的opencv库中的模式识别算法制作一个简易的模式识别系统,使用自己搜集到的数据集对模型进行训练,最终完成特征提取、分类等工作,并且在最后的推理过程中,实现了车牌识别的工作。
(2)系统流程图1.2 题目研究的工作基础或实验条件项目的编程环境为python,编译器使用pycharm2021.3 x64,设计一个车牌识别系统,有GUI界面。
选择一张有车牌的图片后,完成车牌定位、倾斜校正、字符分割,最后通过k-NN 算法对车牌的字母和数字进行识别,将识别结果在GUI界面中显示出来1.3 数据集描述车牌定位就是在图片中识别出哪个位置有车牌,是字符分割和字母数字识别的前提,是车牌识别系统的关键和难点。
:例如,训练数据的目录结构树如下所示:1.4 特征提取过程描述1.对原始图像进行高斯模糊,减少噪点。
2.提取图像边缘。
首先将彩色图像转为灰度图gray,利用大核对灰度图进行开操作得到图像open,相当于对灰度图进行涂抹操作,将灰度图gray和开操作后的图像open按1:-1的比例融合得到图像add,以上操作可以将大面积灰度值相似的地方置黑,可以减少车灯、背景、地面、挡风玻璃等细节。
接着使用canny 算法对融合图像add提取边缘,得到图像canny。
3.使用横向长条作为核对边缘图像进行一次闭操作,得到图像close,相当于对边缘横向涂抹,因为一般视角车牌是宽大于高的矩形。
再对图像close进行一次开操作,得到图像open2,消除较细的线条和不大的竖向线条,从而将车牌位置的连通区域独立出来。
4.查找连通区域,通过最小外接矩形的宽高比2~5.5筛选合适的连通区域。
5.将最小外接矩形图像旋转矫正,上下左右向外扩展一点范围,避免连通区域没能覆盖车牌造成影响。
6.将连通区域原图转为HSV图像,确定图像的主要颜色,若不为蓝、黄、绿,则排除。
基于OpenCV的车牌定位和校正方法

Ke y wo r d s :O p e n C V; v e ic h l e i l c e n s e p l a t e ; r e c o g n i t i o n ; l o c a t i o n ; c o r r e c t i o n ; t e x t u r e f e a t u r e ; c o l o r f e a t u r e
Ab s t r a c t :V e h i c l e l i c e n s e p l a t e r e c o g n i t i o n i s a n i mp o r t a n t t e c h n o l o g y i n t r a l i % ma n a g e me n t .L o c a t i o n a n d c o r r e c i t o n o f
车牌识别代码OpenCV

车牌识别代码OpenCV#include<opencv2\opencv.hpp>#include<iostream> using namespace cv; using namespace std; int areas;//该函数⽤来验证是否是我们想要的区域,车牌定位原理其实就是在图⽚上寻找矩形,我们可以⽤长宽⽐例以及⾯积来验证是否是我们想要的矩形,宽⾼⽐为520/110=4.7272 (车牌的长除以宽),区域⾯积最⼩为15个像素,最⼤为125个像素bool VerifySize(RotatedRect candidate) { float error = 0.4; //40%的误差范围float aspect = 4.7272;//宽⾼⽐例int min = 25 * aspect * 25; //最⼩像素为15int max = 125 * aspect * 125;//最⼤像素为125float rmin = aspect - aspect*error;//最⼩误差float rmax = aspect + aspect*error;//最⼤误差int area = candidate.size.height*candidate.size.width;//求⾯积float r = (float)candidate.size.width / (float)candidate.size.height;//长宽⽐if (r < 1)r = 1 / r;if (area<min || area>max || r<rmin || r>rmax)return false;elsereturn true; } int main(int argc, char** argv) {Mat src;src = imread("D:\\Car1.jpg");//读取含车牌的图⽚if (!src.data) {cout << "Could not open Car.jph.." << endl;return -1;}Mat img_gray;cvtColor(src, img_gray, CV_BGR2GRAY);//灰度转换Mat img_blur;blur(img_gray, img_blur, Size(5, 5));//⽤来降噪Mat img_sobel;Sobel(img_gray, img_sobel, CV_8U, 1, 0, 3);//Sobel滤波,对x进⾏求导,就是强调y⽅向,对y进⾏求导,就是强调x⽅向,在此我们对x求导,查找图⽚中的竖直边Mat img_threshold;threshold(img_sobel, img_threshold, 0, 255, THRESH_BINARY | THRESH_OTSU);Mat element = getStructuringElement(MORPH_RECT, Size(21, 5));//这个Size很重要!!不同的图⽚适应不同的Size,待会在下⾯放图,⼤家就知道区别了morphologyEx(img_threshold, img_threshold,MORPH_CLOSE,element);//闭操作,就是先膨胀后腐蚀,⽬的就是将图⽚联通起来,取决于element的Size。
python 实现判断车牌的归属地实训目的及考察的知识点

python 实现判断车牌的归属地实训目的及考察的知识点
摘要:
一、实训目的
二、考察的知识点
三、实现方法
四、具体实现
五、总结
正文:
一、实训目的
车牌归属地判断实训旨在帮助学生深入理解Python 编程语言的应用,提高学生运用Python 处理字符串和正则表达式的能力。
同时,通过对车牌归属地的判断,学生可以更好地理解我国车牌号码的编码规则,提高实际问题解决能力。
二、考察的知识点
本次实训主要考察以下知识点:
1.Python 字符串操作
2.Python 正则表达式
3.车牌归属地编码规则
三、实现方法
实现车牌归属地判断的方法主要有以下两种:
1.基于字符串操作的方法
2.基于正则表达式的方法
四、具体实现
以基于正则表达式的方法为例,具体实现步骤如下:
1.导入re 模块,用于处理正则表达式
2.定义一个函数,接收车牌号码作为参数
3.使用正则表达式匹配车牌号码的前两位字符,判断其是否为省份或直辖市的简称
4.如果匹配成功,返回省份或直辖市的名称,否则返回“未知”
五、总结
通过本次实训,学生可以熟练掌握Python 字符串操作和正则表达式的使用,同时对我国车牌归属地的编码规则有更深入的了解。
车牌定位与车牌字符识别算法的研究与实现

车牌定位与车牌字符识别算法的研究与实现一、本文概述随着智能交通系统的快速发展,车牌识别技术作为其中的核心组成部分,已经得到了广泛的应用。
车牌定位与车牌字符识别作为车牌识别技术的两大关键环节,对于实现自动化、智能化的交通管理具有重要意义。
本文旨在探讨和研究车牌定位与车牌字符识别的相关算法,并通过实验验证其有效性和可行性。
本文首先对车牌定位算法进行研究,分析了基于颜色、纹理和边缘检测等特征的车牌定位方法,并对比了各自的优缺点。
随后,本文提出了一种基于深度学习的车牌定位算法,通过训练卷积神经网络模型实现对车牌区域的准确定位。
在车牌字符识别方面,本文介绍了传统的模板匹配、支持向量机(SVM)和深度学习等识别方法,并对各种方法的性能进行了比较。
在此基础上,本文提出了一种基于卷积神经网络的字符识别算法,通过训练模型实现对车牌字符的准确识别。
本文通过实验验证了所提出的车牌定位与车牌字符识别算法的有效性和可行性。
实验结果表明,本文提出的算法在车牌定位和字符识别方面均具有较高的准确率和鲁棒性,为车牌识别技术的实际应用提供了有力支持。
本文的研究不仅对车牌识别技术的发展具有重要意义,也为智能交通系统的进一步推广和应用提供了有益参考。
二、车牌定位算法的研究与实现车牌定位是车牌字符识别的前提和基础,其主要任务是在输入的图像中准确地找出车牌的位置。
车牌定位算法的研究与实现涉及图像处理、模式识别等多个领域的知识。
车牌定位算法的研究主要集中在两个方面:一是车牌区域的粗定位,即从输入的图像中大致找出可能包含车牌的区域;二是车牌区域的精定位,即在粗定位的基础上,通过更精细的处理,准确地确定车牌的位置。
在车牌粗定位阶段,常用的方法包括颜色分割、边缘检测、纹理分析等。
颜色分割主要利用车牌特有的颜色信息,如中国的车牌一般为蓝底白字,通过颜色空间的转换和阈值分割,可以大致找出可能包含车牌的区域。
边缘检测则主要利用车牌边缘的灰度变化信息,通过算子如Canny、Sobel等检测边缘,从而定位车牌。
基于OpenCV的车牌识别系统中车牌定位的实现

• 113•基于OpenCV的车牌识别系统中车牌定位的实现广东工业大学 魏 雄随着我国社会的迅猛发展,城市交通事业发展也随之步入快节奏,如今智能交通已成为发展的重要方向与研究热点,其中车牌识别技术(O Russakovsky,J Deng,H Su,et al.Image Net large scale visual recognition challenge:International Journal of Computer Vision 2015,115(3):211-263)作为智能交通中最重要的部分之一,一直是国内外学者们研究计算机视觉的热门问题。
该论文设计的车牌定位采用SVM 支持向量机与颜色特征结合从候选车牌中辨别真伪车牌,从而使车牌识别系统具有更快的速度与更高的效率。
基于OpenCV 库并在Visual Studio 2013环境下对该方法进行工程实现,结果表明该方法具有良好的鲁棒性与较高的准确性。
1.车牌定位本论文设计的车牌定位模块的方法是:若用相机捕捉到的图像中车牌方向角度没有太大的偏转或遮挡,则车牌图像中会包含很多的边缘,这些边缘很有可能就是车牌上的字符形成的,如果在一幅图像中有包含大量垂直边缘的矩形块,而且该矩形块的颜色为蓝色、黄色或绿色,则该矩形块很有可能就是车牌产生的图像块。
如图1为车牌定位的流程。
车牌定位的首任务即为对原始图像进行预处理,首先对图像用高斯滤波算子进行高斯平滑,该操作的目的是去除图像的高斯噪声。
然后把滤波后的图像进行灰度化处理,使其转化为灰度图像,这样接下来的操作都是灰度图处理,相比对原始彩色图像进行操作,灰度图处理更加高效快速。
Sobel 算子采用图2中的sobel 卷积因子提取图像中的垂直边缘。
图2 sobel算子图3 边缘提取后腐蚀得到的图像提取边缘后再对图像进行二值化处理,然后使用图像形态学处图1 车牌定位流程图• 114•理中的闭操作,闭操作之后就可以一张包含有很多矩形块的二值图像,其中车辆车牌就包含其中。
车牌矫正

车牌矫正1.从候选车牌区域中扣出包含有车牌的小图(很离奇,一般不是这么做的,作者要求如此)2.分理出车牌区域所在(很关键,直接影响矫正效果)分析:1.如果直接将车牌候选进行常规的分割还是比较困难的,应为转换为普通的灰度图,在进行轮廓检测、提取完全行不通(梯度特征不明显,将检测出字符区域),如下是灰度图:2.进行显著性检测(涉及傅里叶变换,具体不是很懂),检测出显著区域,效果不理想。
如下图所示:3.仔细观察截图可以发现,车牌区域主要为绿色区域,如果我们能直接分离出绿色区域,岂不是很爽,直接矫正即可,于是进行了各种颜色空间的分离,选择RGB、CYCK颜色空间来说明,其中CYCK颜色空间是一种染色空间,织布用的,具体百度之:CYCK颜色空间分离结果:RGB通道分离结果:、4.通过步骤三,具体分析如下,RGB空间分离结果基本不可用,CYCK颜色空间倒是可以考虑考虑,因为其车牌特征比较明显。
于是乎,某人采用比较巧妙地方法分离出车牌区域,将CYCK颜色空间中第一幅图像取反(黑变白,白变黑)与CYCK颜色空间中第四幅图像点乘操作,结果取较小的值分割从而分理处绿色车牌区域。
如下所示为结果(下图为二值图,分割阈值采用0.05的结果,此结果比较理想):可以看到,基本分离出了车牌区域(注意是基本),现在需要做的就是将车牌区域的四个角定位出来,定位的好坏。
3.定位出车牌区域的四个角点1.对上一步的二值图像首先进行腐蚀操作(腐蚀的核比较小),去除边缘干扰白色像素点,再膨胀,去除干扰影响;2.连通中间黑色像素点,即对图像进行膨胀,再腐蚀,其结果如下所示3.对上图进行轮廓提取,即车牌区域的轮廓,并对轮廓进行拟合4.对拟合的轮廓提取四个角点,即四个角点即车牌四边形的四个角点4.用提取的角点对图像进行矫正,转化为正常视图,结果如下:5.代码如下://包悒?含?的?各ô种??文?件t#include"opencv2/opencv.hpp"#include<iostream>//命÷名?空?间?using namespace std;using namespace cv;//从洙甊GB空?间?转羇换?成éCMYK空?间?,?由?pencv 中D没?有瓺这a个?函ˉ数簓所õ以?需è要癮自?己o编括?写′这a个?函ˉ数簓void rgb2cmyk(cv::Mat& src, std::vector<cv::Mat>& cmyk){CV_Assert(src.type() == CV_8UC3);cmyk.clear();//cmyk 容╕器ô清?零?,?否?则ò不?能÷用?at引皔用?其?值μfor (int i = 0; i < 4; ++i)cmyk.push_back(cv::Mat(src.size(), CV_32F));for (int i = 0; i < src.rows; ++i){for (int j = 0; j < src.cols; ++j){cv::Vec3b p = src.at<cv::Vec3b>(i,j);float r = p[2] / 255.;float g = p[1] / 255.;float b = p[0] / 255.;float k = (1 - std::max(std::max(r,g),b));cmyk[0].at<float>(i,j) = (1 - r - k) / (1 - k);cmyk[1].at<float>(i,j) = (1 - g - k) / (1 - k);cmyk[2].at<float>(i,j) = (1 - b - k) / (1 - k);cmyk[3].at<float>(i,j) = k;}}//显?示?代洙?码?,?用??测a试?,?可é以?不?需è要癮,?//?过y测a试?,?得?出?自?己o需è要癮的?东?西ô/*stringstream temp;string temp2;for(int i=cmyk.size();i>0;i--){temp.clear();temp2.clear();temp<<i;temp2=temp.str();imshow(temp2,cmyk.at(i-1));}*/}//开a始?矫?正y的?代洙?码?//输?入?为a矫?正y的?图?像?和í四?个?角?点?,?输?入?图?像?为a二t值μ图?像?//输?出?为a校£正y后ó的?图?像?,//返う?回?值μ为a0表括?示?结á果?不?正y常£,?返う?回?值μ为a1,?表括?示?结á果?很÷正y 常£Mat correct(vector<Point> points,const Mat & srcimg,int width,int height){ // 矩?形?矫?正yif(points.size()!=4)cerr<<"输?入?焦1点?错洙?误ó"<<endl ;//目?标括?点?的?赋3值μ和í确ø?认?Point2f dst[4],src[4];//如?果?width,?height为a0,?则ò将?src的?宽í度è和í高?度è作痢?为a矫?正y的?基õ准?if(width==0&&height==0)height=srcimg.rows,width=srcimg.cols;//最?终?焦1点?位?置?// 0**************1// 2**************3dst[0] = Point2f(0,0);dst[1] = Point2f(width, 0);dst[2] = Point2f(0, height);dst[3] = Point2f(width, height);//起e始?点?的?选?取?//确ø?定¨中D心?位?置?Point2f center=Point2f(.0,.0);for(int i=0;i<4;i++){center.x+=points[i].x;center.y+=points[i].y;}center.x/=4;center.y/=4;//初?始?角?点?位?置?//0************1//2************3int ptnum;for( int j = 0;j < 4; j++ ){if(points[j].x>center.x&&points[j].y>center.y) ptnum=3;else if(points[j].x<center.x&&points[j].y>center.y) ptnum=2;else if(points[j].x>center.x&&points[j].y<center.y) ptnum=1;else if(points[j].x<center.x&&points[j].y<center.y) ptnum=0;src[ptnum]=points[j];}//Create and rotate imageMat undistorted = Mat(Size(width, height), srcimg.type(),Scalar(0));warpPerspective(srcimg, undistorted, cv::getPerspectiveTransform(src, dst), Size(width, height));return undistorted;}//作痢?为a漫t水?填?充?的?临ⅷ?时骸?图?像?,?将?原-图?扩?大洙?一?被?Mat changeSize(Mat& src){int xsize = src.cols;int ysize = src.rows;//临ⅷ?时骸?图?像?,?保馈?存?临ⅷ?时骸?图?像?Mat cloneImg = Mat(ysize*2,xsize*2, CV_8UC1,Scalar(0));//起e始?点?坐?标括?int startAtX =xsize/2;int startAtY =ysize /2;//设Θ?置?操õ作痢?区??Mat temp=cloneImg(Rect(startAtX,startAtY,xsize,ysize));src.copyTo(temp);return cloneImg;}int main(int argc, char *argv[]){//读á入?图?片?Mat src, dst;src=imread("pic3.jpg",1);if(!src.data)return -1;//将?原-图?进?行D颜?色?空?间?转羇换?,?cyck颜?色?空?间?转羇换?效§果?vector<Mat> cmyk,RGB,HSV;rgb2cmyk(src,cmyk);//CYCK颜?色?空?间?分?离?cv::Mat im1;im1 = cmyk[0].mul(1 -cmyk[3])>0.06;//膨ò胀í前©需è要癮将?原-图?扩?大洙?,?否?则ò因皑?为a边?缘μ会á导?致?腐ˉ蚀骸?失骸?败悒?Mat gray,im2;im1.convertTo(im1, CV_8U);imshow("result1",im1);gray=changeSize(im1);//开a始?膨ò胀í和í腐ˉ蚀骸?Mat kernel0= (Mat_<uchar>(3,3)<<0,1,0,1,1,1,0,1,0);Mat kernel1 = Mat(17,17,CV_8U,Scalar(1));//图?像?腐ˉ蚀骸?,?去ǎ?除y边?缘μ白恪?色?像?素?点?,?erode(gray, gray, kernel0);//imshow("erode",gray);//图?像?膨ò胀í,?将?白恪?色?像?素?点?扩?大洙?,?去ǎ?除y中D心?亮ⅷ?的?像?素?点? 核?较?小?,?去ǎ?除y边?缘μ白恪?色?像?素?dilate(gray, gray, kernel0);//imshow("dialate",gray);//图?像?膨ò胀í,?将?白恪?色?像?素?点?扩?大洙?,?去ǎ?除y中D心?黑ö色?的?的?像?素?点? 核?较?大洙?dilate(gray, gray, kernel1);imshow("dialate",gray);//图?像?膨ò胀í,?去ǎ?除y膨ò胀í边?缘μ效§果?erode(gray, gray, kernel1);imshow("erode",gray);//取?原-图?的?im2=gray(Rect(gray.cols/4,gray.rows/4,gray.cols/2,gray.rows/2));im2.copyTo(gray);//开a始?寻©找ò边?缘μ,?此?处鋦构1建¨边?缘μ存?贮÷变?量?vector<vector<Point>> contours;// find contoursfindContours(gray,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);//轮?a合?,理え?论?上?为a最?大洙?,?approxPolyDP(contours[0], contours[0], 4, true);//画-出?拟a合?轮??并¢显?示?Mat result(gray.size(),CV_8U,Scalar(0));drawContours(result,contours,CV_FILLED,Scalar(255),1);imshow("result",result);//开a始??取?角?点?vector<Point> scrs;goodFeaturesToTrack(result,scrs,4, // maximum number of corners to be returned0.1, // quality level10); // minimum allowed distance between points//?示?函ˉ数簓if(scrs.size()!=4)cerr<<endl<<"?取?的?角?点?数簓量?是?; "<<scrs.size()<<endl;//画-出?角?点?//画-角?点?的?临ⅷ?时骸?变?量?Mat External;src.copyTo(External);// 函ˉ数簓原-型í声Θ?明ô//void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;External.convertTo(External,CV_8UC3,1,0);for(int v=0;v<scrs.size();v++){circle(External,scrs[v],3,CV_RGB(0,255,0),1);}imshow("角?点?",External);//开a始?矫?正yMat out;out=correct(scrs,src,0,0);imshow("out",out);//图?像?显?示?暂Y?函ˉ数簓char c=(char)waitKey(0);if(c!=(char)waitKey(0))waitKey(0);return 0;}。
基于python的车牌识别系统设计原理

基于python的车牌识别系统设计原理
车牌识别系统通常包括车辆检测、车牌定位和字符分割等主要步骤。
以下是一个基于Python的车牌识别系统的设计原理:
1. 车辆检测:这一步通常采用视频检测技术,通过在视频流中检测移动物体(如车辆)来实现。
常用的方法包括埋地线圈检测、红外检测、雷达检测和视频检测等。
视频检测技术具有不破坏路面、不需附加外部检测设备、不需矫正触发位置以及适合移动式、便携式应用等优点。
在进行视频车辆检测时,需要具备很高的处理速度并采用优秀的算法,在基本不丢帧的情况下实现图像采集、处理。
2. 车牌定位:在检测到车辆后,系统需要在图像中准确地定位车牌区域。
由于汽车图像背景复杂、光照不均匀,这一步是整个识别过程的关键。
常用的方法包括基于颜色、边缘、纹理等特征的分割方法,以及基于深度学习的目标检测方法(如YOLO、SSD等)。
3. 字符分割:在完成牌照区域的定位后,需要将牌照区域分割成单个字符。
这一步通常采用垂直投影法或水平投影法,根据车牌字符的宽度和间距进行分割。
4. 字符识别:最后,系统需要对分割后的字符进行识别。
常用的方法包括模板匹配法和深度学习方法。
模板匹配法是将分割后的字符与预定义的模板进
行比对,找到最相似的模板作为识别结果。
深度学习方法则是通过训练深度神经网络进行字符识别。
基于Python的车牌识别系统可以使用OpenCV、Pytorch等开源库来实现上述步骤。
在实际应用中,还需要考虑如何提高系统的鲁棒性和准确性,例如通过调整算法参数、训练更复杂的模型等方法来实现。
基于opencv的车牌识别的代码

基于opencv的车牌识别的代码车牌识别技术在现代交通管理、智能停车场等领域有着广泛的应用。
而基于 OpenCV 实现车牌识别是一种常见且有效的方法。
下面我们就来详细探讨一下实现车牌识别的代码逻辑和关键步骤。
首先,在开始编写代码之前,我们需要确保已经安装好了 OpenCV库以及相关的依赖项。
接下来,我们逐步分解车牌识别的主要流程。
第一步,图像采集。
这可以通过摄像头实时获取图像,或者读取已经存在的图片文件。
```pythonimport cv2从摄像头获取图像cap = cv2VideoCapture(0)或者读取图片文件image = cv2imread('platejpg')```第二步,图像预处理。
这一步的目的是提高图像质量,以便后续的处理。
常见的操作包括灰度化、高斯模糊去噪、边缘检测等。
```python灰度化gray_image = cv2cvtColor(image, cv2COLOR_BGR2GRAY)高斯模糊blurred_image = cv2GaussianBlur(gray_image, (5, 5), 0)Canny 边缘检测edges = cv2Canny(blurred_image, 50, 150)```第三步,车牌定位。
这是整个车牌识别中最关键的步骤之一。
通常会利用车牌的形状、颜色、纹理等特征来定位车牌。
```python寻找轮廓contours, _= cv2findContours(edges, cv2RETR_EXTERNAL,cv2CHAIN_APPROX_SIMPLE)for contour in contours:计算轮廓的面积和周长area = cv2contourArea(contour)perimeter = cv2arcLength(contour, True)根据面积和周长等条件筛选出可能的车牌区域if area > 1000 and perimeter > 300:获取车牌区域的矩形边界x, y, w, h = cv2boundingRect(contour)提取车牌区域plate_image = imagey:y + h, x:x + w```第四步,字符分割。
车牌定位函数并返回车牌轮廓位置理想外轮廓python代码

车牌定位和轮廓提取在图像处理中是一个常见的问题,涉及到计算机视觉和图像分析的知识。
在这个问题中,我们将使用Python语言和OpenCV库来解决这个问题。
以下是一个基本的步骤和代码示例:**步骤**:1. **车牌区域检测**:使用颜色过滤或边缘检测等方法来检测车牌区域。
2. **车牌轮廓提取**:使用形态学操作(如开运算和闭运算)来消除噪声,并通过轮廓跟踪等方法提取车牌的理想外轮廓。
```pythonimport cv2import numpy as npdef detect_car_plate(image_path):# 读取图像img = cv2.imread(image_path)# 转换为灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用颜色过滤方法检测车牌区域# 这里使用的是颜色阈值法,可以根据实际情况调整颜色阈值# 这种方法简单但可能漏检,需要结合其他方法使用thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]plate_region = cv2.bitwise_and(img, img, mask=thresh)# 使用形态学操作去除噪声,并提取车牌外轮廓# 这里使用的是开运算和闭运算,也可以根据实际情况调整形态学操作# 通过跟踪轮廓等方法可以进一步优化外轮廓kernel = np.ones((5,5),np.uint8)opening = cv2.morphologyEx(plate_region, cv2.MORPH_OPEN, kernel)closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)contours, hierarchy = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 返回车牌外轮廓的位置信息return contours```以上代码只是一个简单的示例,实际应用中可能需要结合其他方法(如边缘检测、霍夫变换等)来提高车牌定位的准确性和鲁棒性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#endif
int thresh = 50;
IplImage* img = 0;
IplImage* img0 = 0;
CvMemStorage* storage = 0;
CvPoint pt[4];
const char* wndname = "Square Detection Demo";
{
double dx1 = pt1->x - pt0->x;
double dy1 = pt1->y - pt0->y;
double dx2 = pt2->x - pt0->x;
double dy2 = pt2->y - pt0->y;
return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
车牌定位有很多种算法,从最简单的来,车牌在图像中一般被认为是长方形,由于图像摄取角度不同也可能是四边形。我们可以使用OpenCV中的实例: C:/Program Files/OpenCV/samples/c.squares.c 这是一个搜索图片中矩形的一个算法。我们只要稍微修改一下就可以实现定位车牌。
// relatively large area (to filter out noisy contours)
// and be convex.
// Note: absolute value of an area is used because
// tgray(x,y) = gray(x,y) < (l+1)*255/N ? 255 : 0
//cvThreshold( tgray, gray, (l+1)*255/N, 255, CV_THRESH_BINARY );
在这个实例中使用了canny算法进行边缘检测,然后二值化,接着用cvFindContours搜索轮廓,最后从找到的轮廓中根据角点的个数,角的度数和轮廓大小确定,矩形位置。以下是效果图:
这个算法可以找到一些车牌位置,但在复杂噪声背景下,或者车牌图像灰度与背景相差不大就很难定位车牌
if( i >= 2 )
{
t = fabs(angle(
(CvPoint*)cvGetSeqElem( result, i ),
}
// returns sequence of squares detected on the image.
// the sequence is stored in the specified memory storage
CvSeq* findSquares4( IplImage* img, CvMemStorage* storage )
IplImage* gray = cvCreateImage( sz, 8, 1 );
IplImage* pyr = cvCreateImage( cvSize(sz.width/2, sz.height/2), 8, 3 );
IplImage* tgray;
CvSeq* result;
// Canny helps to catch squares with gradient shading
if( l == 0 )
{
// apply Canny. Take the upper threshold from slider
CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.02, 0 );
// square contours should have 4 vertices after approximation
// down-scale and upscale the image to filter out the noise
cvPyrDown( timg, pyr, 7 );
cvPyrUp( pyr, timg, 7 );
tgray = cvCreateImage( sz, 8, 1 );
fabs(cvContourArea(result,CV_WHOLE_SEQ)) > 1000 &&
cvCheckContourConvexity(result) )
{
s = 0;
// helper function:
// finds a cosine of angle between vectors
// from pt0->pt1 and from pt0->pt2
double angle( CvPoint* pt1, CvPoint* pt2, CvPoint* pt0 )
// holes between edge segments
cvDilate( gray,
// apply threshold if l!=0:
// and set the lower to 0 (which forces edges merging)
cvCanny( tgray, gray,60, 180, 3 );
// dilate canny output to remove potential
cvCopy( timg, tgray, 0 );
// try several threshold levels
for( l = 0; l < N; l++ )
{
// hack: use Canny instead of zero threshold level.
double s, t;
// create empty sequence that will contain points -
// 4 points per square (the square's vertices)
CvSeq* squares = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvPoint), storage );
CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );
// test each contour
while( contours )
{
OpenCV下车牌定位算法实现代码(一)
分类: 图像处理 2006-04-18 23:56 13090人阅读 评论(8) 收藏 举报
算法imageprocessingfunctionmath.hfilter
车牌定位算法在车牌识别技术中占有很重要地位,一个车牌识别系统的识别率往往取决于车牌定位的成功率及准确度。
(CvPoint*)cvGetSeqElem( result, i-2 ),
(CvPoint*)cvGetSeqElem( result, i-1 )));
for( i = 0; i < 5; i++ )
{
// find minimum angle between joint
// edges (maximum of cosine)
所以我们需要寻找更好的定位算法。下面是squares的代码:
#ifdef _CH_
#pragma package <opencv>
#endif
#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <math.h>
// select the maximum ROI in the image
// with the width and height divisible by 2
cvSetImageROI( timg, cvRect( 0, 0, sz.width, sz.height ));
// find squares in every color plane of the image
for( c = 0; c < 3; c++ )
{
// extract the c-th color plane
cvSetImageCOI( timg, c+1 );
{
CvSeq* contours;
int i, c, l, N = 11;
CvSize sz = cvSize( img->width & -2, img->height & -2 );
IplImage* timg = cvCloneImage( img ); // make a copy of input image
// area may be positive or negative - in accordance with the
// contour orientation
if( result->total == 4 &&
// approximate contour with accuracy proportional
// to the contour perimeter
result = cvApproxPoly( contours, sizeof(CvContour), storage,