基于OpenCV的硬币面值识别

本项目通过Python与Opencv结合数字图像处理技术对1元、5角、1角三种硬币进行识别。首先通过Canny算子对图像进行边缘检测,然后进一步调用定义的函数去除边缘检测后图像中的孤立点,对处理后的图像进行Hough变换检测圆曲线,进而可以把圆的半径储存在列表中,对所得到的数据进行K-means聚类分析(无监督学习),确定要将目标分为3类,进行迭代,当三类的聚类中心不在发生改变时,确定类,终止迭代。将半径值与类中心进行匹配,实现对1元、5角、1角三种硬币的识别,并在图像上标注显示。

一、方法原理

本项目通过Python与Opencv结合数字图像处理技术对1元、5角、1角三种硬币进行识别。本项目的方法实现过程如下:

首先读取图像,通过Canny算子对图像进行边缘检测,然后进一步调用定义的函数去除边缘检测后图像中的孤立点,对处理后的图像进行广义Hough变换检测圆曲线,进而可以把圆的半径储存在列表中,对所得到的数据进行K-means聚类分析(无监督学习),确定要将目标分为3类,进行迭代,当三类的聚类中心不在发生改变时,确定类,终止迭代。将半径值与类中心进行匹配,实现对1元、5角、1角三种硬币的识别,并在图像上标注显示。此外我们与Matlab程序实验结果进行对比。经测试证明,Opencv所写程序既保持了高效的识别率,代码较少,有一定的实际应用价值。

OpenCV图像处理过程如下:

8b6902cd5c6d443788e78a396bf7f5bd.png

简介广义Hough变换检测圆:在检测直线时,常常考虑的是使用 1e75237a8eee40aaae2b836d9ee20add.png来表示一条直线,其中 为该直线到原点的垂直距离, 为该直线的垂线与x轴夹角。如图1.2所示:

 512863a9d5d74c498a120ed6857db7d5.png

ae11bfcbe580498faf65991bd68d4b34.png

 4ace46b0fc4a44e9af9013d41a44839a.png

简介K-means聚类分析:所谓聚类算法是指将一堆没有标签的数据自动划分成几类的方法,属于无监督学习方法,这个方法要保证同一类的数据有相似的特征。根据样本之间的距离或者说是相似性(亲疏性),把越相似、差异越小的样本聚成一类(簇),最后形成多个簇,使同一个簇内部的样本相似度高,不同簇之间差异性高。

基本步骤:

1)在n个数据对象任意选择k(已经确定的)个对象作为初始聚类中心

2)计算每个对象与聚类中心的距离;并根据最小距离重新对相应对象进行划分3)重新计算每个聚类的均值作为新的聚类中心

4)循环(2)到(3)直到每个聚类不再发生变化为止(自己设定终止条件)

在编写程序过程中,我们为了得到比较满意的效果,对一些函数的参数进行了调试,如Canny算子中两个阈值,除去孤立点时参照数以及Hough变换缘检测中对应的参数

1、# param1的具体实现,用于边缘检测

canny = cv2.Canny(img, 400, 400);

2、res=del_dot(canny,15);

3、circles = cv2.HoughCircles(res, cv2.HOUGH_GRADIENT, 1, 50, param1=80, param2=30);

最终实现效果:

c8bdbfe3008e42f18d60624baee01f1a.pngac99ed9ad7bb4c3bbcc124ad4ef5300a.png

结果分析 

用OpenCV对硬币进行K-means聚类分析,运行速度快,部分结果准确;用Matlab程序计算分析运行速度慢,精准度不高。

工程源码分享:

链接:https://pan.baidu.com/s/12hV-8J5OmwTLCtpZ6TfgWg 
提取码:kemj

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_51533426/article/details/130152744