C#中的深度学习(一):使用OpenCV识别硬币
在本系列文章中,我们将使用深度神经网络(DNN)来执行硬币识别。具体来说,我们将训练一个DNN识别图像中的硬币。
在本文中,我们将描述一个OpenCV应用程序,它将检测图像中的硬币。硬币检测是硬币完整识别之前的一个常见阶段。它包括从给定图像中检测和提取硬币。

本系列附带的代码将使用Keras在C#中实现。在本系列的最后一篇文章中,我们将简要地使用ML.NET。在众多选择中,为什么要使用Keras.NET呢?Keras.NET 非常容易学习,因为它基本上是从Python编写的经典TensorFlow到C#的直接映射。对于不熟悉机器学习的读者来说,这比用其他方法创建示例要容易得多。
硬币检测过程分为三个阶段:
- 转换图像到灰度。颜色增加了检测任务的复杂性,而且在很多情况下,它们不能传递任何可以从图像亮度中获取的相关信息。
- 应用高斯模糊。因为硬币通常包含一个内圆,我们应用这个变换来模糊图像。这确保了任何内圆被下一步中的操作忽略,所以我们的算法不会意外地认为它们是一个单独的硬币。
- 应用霍夫变换。这是为了检测圆形。
首先,让我们在Visual Studio Community 2019中创建一个.net Framework 4.7.2控制台应用程序。我们将把我们的解决方案和项目命名为“CoinRecognitionExample”,并在其中创建一个Detection文件夹,创建一个CoinDetector类。

我们将使用OpenCVSharp,所以我们可以继续在Visual Studio中从Nuget包管理器安装依赖项。要做到这一点,请点击Tools > Nuget Package Manager.
我们可以看到需要安装OpenCVSharp的依赖项。

具体的实现发生在CoinDetector类中:
1 public class CoinDetector
2 {
3 private Mat _image;
4 private Mat _originalImage;
5 private string _pathToFile;
6
7 public CoinDetector(string pathToFile)
8 {
9 _pathToFile = pathToFile;
10 }
11
12 public void ImagePreprocessing()
13 {
14 _image = new Mat(_pathToFile, ImreadModes.Color);
15 _originalImage = _image.Clone();
16 TransformGrayScale();
17 TransformGaussianBlur();
18 HoughSegmentation();
19 }
20
21 private void TransformGrayScale()
22 {
23 _image = _originalImage.CvtColor(ColorConversionCodes.BGR2GRAY);
24 new Window("Grayed Coins", WindowMode.Normal, _image);
25 Cv2.WaitKey();
26 }
27
28 private void TransformGaussianBlur()
29 {
30 Cv2.GaussianBlur(_image, _image, new Size(0, 0), 1);
31 new Window("Blurred Coins", WindowMode.Normal, _image);
32 //Cv2.WaitKey();
33 }
34
35 private void HoughSegmentation()
36 {
37 Mat result = _image.Clone();
38
39 var circleSegments = Cv2.HoughCircles(_image, HoughMethods.Gradient, 1.02, 40);
40 for (int i = 0; i < circleSegments.Length; i++)
41 {
42 Cv2.Circle(result, (Point) circleSegments[i].Center, (int)circleSegments[i].Radius, new Scalar(255, 255, 0), 2);
43 }
44
45 using (new Window("Circles", result))
46 {
47 Cv2.WaitKey();
48 }
49 }
50 }
在类的构造函数中,我们接收到硬币图像的路径。这个方法和ImagePreprocessing方法是CoinDetector类中仅有的两个公共实体。所有其他方法都是私有的,与上面列出的三个阶段相关。在ImageProcessing 方法中,我们保存一个原始的Mat(像素矩阵)对象的图像,并生成即将发生的转换副本。Mat类和所有对Cv2类的调用都来自OpenCVSharp。在每次转换之后,我们调用new Window以可视化地显示转换。Cv2.HoughCircles的参数取决于你所面临的问题,也就是正在处理的图像。
代码中显示的参数符合我们的示例。
要完成硬币检测示例,我们可以在控制台应用程序项目的主方法中添加以下代码行并执行。
1 string filePath = @"C:/Users/arnal/Documents/coins.jpg";
2 var coinDetector = new CoinDetector(filePath);
3 coinDetector.ImagePreprocessing();
这是我们将用于测试的图像。其中包括塞尔维亚第纳尔硬币:

最终的结果将是我们之前看到的图像:

正如我们所看到的,在中间使用对应霍夫变换的白色圆圈标识,并被识别出来。
本系列的第一篇文章到此结束。在下一篇文章中,我们将对输入到机器学习模型中的数据集进行预处理。
C#中的深度学习(一):使用OpenCV识别硬币的更多相关文章
- CNCC2017中的深度学习与跨媒体智能
CNCC2017中的深度学习与跨媒体智能 转载请注明作者:梦里茶 目录 机器学习与跨媒体智能 传统方法与深度学习 图像分割 小数据集下的深度学习 语音前沿技术 生成模型 基于贝叶斯的视觉信息编解码 珠 ...
- Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 之一
Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 ABSTRACT: Deep learning algorithms ar ...
- 基于深度学习的人脸性别识别系统(含UI界面,Python代码)
摘要:人脸性别识别是人脸识别领域的一个热门方向,本文详细介绍基于深度学习的人脸性别识别系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面.在界面中可以选择人脸图片.视频进行检 ...
- NLP入门(五)用深度学习实现命名实体识别(NER)
前言 在文章:NLP入门(四)命名实体识别(NER)中,笔者介绍了两个实现命名实体识别的工具--NLTK和Stanford NLP.在本文中,我们将会学习到如何使用深度学习工具来自己一步步地实现N ...
- 用深度学习做命名实体识别(二):文本标注工具brat
本篇文章,将带你一步步的安装文本标注工具brat. brat是一个文本标注工具,可以标注实体,事件.关系.属性等,只支持在linux下安装,其使用需要webserver,官方给出的教程使用的是Apac ...
- 行人重识别(ReID) ——基于深度学习的行人重识别研究综述
转自:https://zhuanlan.zhihu.com/p/31921944 前言:行人重识别(Person Re-identification)也称行人再识别,本文简称为ReID,是利用计算机视 ...
- ui2code中的深度学习+传统算法应用
背景 在之前的文章中,我们已经提到过团队在UI自动化这方面的尝试,我们的目标是实现基于 单一图片到代码 的转换,在这个过程不可避免会遇到一个问题,就是为了从单一图片中提取出足够的有意义的结构信息,我们 ...
- [Deep-Learning-with-Python]计算机视觉中的深度学习
包括: 理解卷积神经网络 使用数据增强缓解过拟合 使用预训练卷积网络做特征提取 微调预训练网络模型 可视化卷积网络学习结果以及分类决策过程 介绍卷积神经网络,convnets,深度学习在计算机视觉方面 ...
- 在浏览器中进行深度学习:TensorFlow.js (八)生成对抗网络 (GAN
Generative Adversarial Network 是深度学习中非常有趣的一种方法.GAN最早源自Ian Goodfellow的这篇论文.LeCun对GAN给出了极高的评价: “There ...
- PyTorch中使用深度学习(CNN和LSTM)的自动图像标题
介绍 深度学习现在是一个非常猖獗的领域 - 有如此多的应用程序日复一日地出现.深入了解深度学习的最佳方法是亲自动手.尽可能多地参与项目,并尝试自己完成.这将帮助您更深入地掌握主题,并帮助您成为更好的深 ...
随机推荐
- 手把手为大家演示fat32转ntfs操作过程,一看就会
fat32和ntfs是两种我们较为常见的u盘或者硬盘格式.它们都有着各自的特点,但是相比之下,使用ntfs文件格式我们可以做出很多fat32不能实现的功能.在日常生活中,我们会面临到需要把fat32转 ...
- Vegas干货分享,如何制作霓虹灯效果
在各色各样的展会中,各种炫彩华丽的灯光和光影一直都能吸引到人们大量的关注.同样,在视频制作中,光线的气氛渲染也是常用的方法,常用也就代表着效果明显,也是很多刚学视频剪辑小伙伴们想要学习的一种方法. 今 ...
- 从维基百科等网站复制数据和公式到MathType里编辑
在我们写论文的时候,经常会需要用一些实际案例以及数据,而这些数据和案例有很大一部分可以直接在网络上找到.但是有时候也会发现我们想要的内容和公式,从网页上复制粘贴后太模糊,不适合打印和投影.就需要我们将 ...
- 利用perspective 和 transform 里面的几个参数来实现旋转照片墙
旋转照片墙 首先,来看下,是什么效果吧,上效果图 ↓ 其实这个东西,很容易制作,先说下思路, 把照片都给叠在一起,然后 rotateY 旋转,给每张图片 旋转不一样的角度能构成一圈, 然后transl ...
- java工作两年了,连myBatis中的插件机制都玩不懂,那你工作危险了!
插件的配置与使用 在mybatis-config.xml配置文件中配置plugin结点,比如配置一个自定义的日志插件LogInterceptor和一个开源的分页插件PageInterceptor: & ...
- iOS 默认Cell选中
NSInteger selectIndex = [NSIndexPath indexPathForItem:0 inSection:0]; [self.ui_tableView selectRowAt ...
- 1、Go语言介绍
一 Go语言介绍 Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言. Go是静态强类型语言,是区别于解析型语言的编译型语言. 解析型语言--源代码是先翻译为中间代码, ...
- [COCI2016-2017#1] Mag 结论证明
结论:最多包含一个 \(2\),并且不在链的两端点. 证明:我们问题分成两个 \(\texttt{pass}\). \(\texttt{pass 1}\):\(\forall u,s.t.x_{u}\ ...
- 痞子衡嵌入式:一次利用IAR自带CRC完整性校验功能的实践(为KBOOT加BCA)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是利用IAR自带CRC完整性校验功能的一次实践(为KBOOT加BCA). 痞子衡之前写过两篇关于IAR中自带CRC校验功能的文章 < ...
- 【mq读书笔记】mq读写分离机制
mq根据brokerName查找Broker地址的过程 mq根据MessageQueue查找Broker地址的唯一依据是brokerName,同一组Broker(M-S)他们的bokerName相同但 ...