c# 使用OpenCV識(shí)別硬幣
在本系列文章中,我們將使用深度神經(jīng)網(wǎng)絡(luò)(DNN)來(lái)執(zhí)行硬幣識(shí)別。具體來(lái)說(shuō),我們將訓(xùn)練一個(gè)DNN識(shí)別圖像中的硬幣。
在本文中,我們將描述一個(gè)OpenCV應(yīng)用程序,它將檢測(cè)圖像中的硬幣。硬幣檢測(cè)是硬幣完整識(shí)別之前的一個(gè)常見(jiàn)階段。它包括從給定圖像中檢測(cè)和提取硬幣。

本系列附帶的代碼將使用Keras在C#中實(shí)現(xiàn)。在本系列的最后一篇文章中,我們將簡(jiǎn)要地使用ML.NET。在眾多選擇中,為什么要使用Keras.NET呢?Keras.NET 非常容易學(xué)習(xí),因?yàn)樗旧鲜菑腜ython編寫(xiě)的經(jīng)典TensorFlow到C#的直接映射。對(duì)于不熟悉機(jī)器學(xué)習(xí)的讀者來(lái)說(shuō),這比用其他方法創(chuàng)建示例要容易得多。
硬幣檢測(cè)過(guò)程分為三個(gè)階段:
- 轉(zhuǎn)換圖像到灰度。顏色增加了檢測(cè)任務(wù)的復(fù)雜性,而且在很多情況下,它們不能傳遞任何可以從圖像亮度中獲取的相關(guān)信息。
- 應(yīng)用高斯模糊。因?yàn)橛矌磐ǔ0粋€(gè)內(nèi)圓,我們應(yīng)用這個(gè)變換來(lái)模糊圖像。這確保了任何內(nèi)圓被下一步中的操作忽略,所以我們的算法不會(huì)意外地認(rèn)為它們是一個(gè)單獨(dú)的硬幣。
- 應(yīng)用霍夫變換。這是為了檢測(cè)圓形。
首先,讓我們?cè)赩isual Studio Community 2019中創(chuàng)建一個(gè).net Framework 4.7.2控制臺(tái)應(yīng)用程序。我們將把我們的解決方案和項(xiàng)目命名為“CoinRecognitionExample”,并在其中創(chuàng)建一個(gè)Detection文件夾,創(chuàng)建一個(gè)CoinDetector類。

我們將使用OpenCVSharp,所以我們可以繼續(xù)在Visual Studio中從Nuget包管理器安裝依賴項(xiàng)。要做到這一點(diǎn),請(qǐng)點(diǎn)擊Tools > Nuget Package Manager.
我們可以看到需要安裝OpenCVSharp的依賴項(xiàng)。

具體的實(shí)現(xiàn)發(fā)生在CoinDetector類中:
public class CoinDetector
{
private Mat _image;
private Mat _originalImage;
private string _pathToFile;
public CoinDetector(string pathToFile)
{
_pathToFile = pathToFile;
}
public void ImagePreprocessing()
{
_image = new Mat(_pathToFile, ImreadModes.Color);
_originalImage = _image.Clone();
TransformGrayScale();
TransformGaussianBlur();
HoughSegmentation();
}
private void TransformGrayScale()
{
_image = _originalImage.CvtColor(ColorConversionCodes.BGR2GRAY);
new Window("Grayed Coins", WindowMode.Normal, _image);
Cv2.WaitKey();
}
private void TransformGaussianBlur()
{
Cv2.GaussianBlur(_image, _image, new Size(0, 0), 1);
new Window("Blurred Coins", WindowMode.Normal, _image);
//Cv2.WaitKey();
}
private void HoughSegmentation()
{
Mat result = _image.Clone();
var circleSegments = Cv2.HoughCircles(_image, HoughMethods.Gradient, 1.02, 40);
for (int i = 0; i < circleSegments.Length; i++)
{
Cv2.Circle(result, (Point) circleSegments[i].Center, (int)circleSegments[i].Radius, new Scalar(255, 255, 0), 2);
}
using (new Window("Circles", result))
{
Cv2.WaitKey();
}
}
}
在類的構(gòu)造函數(shù)中,我們接收到硬幣圖像的路徑。這個(gè)方法和ImagePreprocessing方法是CoinDetector類中僅有的兩個(gè)公共實(shí)體。所有其他方法都是私有的,與上面列出的三個(gè)階段相關(guān)。在ImageProcessing 方法中,我們保存一個(gè)原始的Mat(像素矩陣)對(duì)象的圖像,并生成即將發(fā)生的轉(zhuǎn)換副本。Mat類和所有對(duì)Cv2類的調(diào)用都來(lái)自O(shè)penCVSharp。在每次轉(zhuǎn)換之后,我們調(diào)用new Window以可視化地顯示轉(zhuǎn)換。Cv2.HoughCircles的參數(shù)取決于你所面臨的問(wèn)題,也就是正在處理的圖像。
代碼中顯示的參數(shù)符合我們的示例。
要完成硬幣檢測(cè)示例,我們可以在控制臺(tái)應(yīng)用程序項(xiàng)目的主方法中添加以下代碼行并執(zhí)行。
string filePath = @"C:/Users/arnal/Documents/coins.jpg"; var coinDetector = new CoinDetector(filePath); coinDetector.ImagePreprocessing();
這是我們將用于測(cè)試的圖像。其中包括塞爾維亞硬幣:

最終的結(jié)果將是我們之前看到的圖像:

正如我們所看到的,在中間使用對(duì)應(yīng)霍夫變換的白色圓圈標(biāo)識(shí),并被識(shí)別出來(lái)。
本系列的第一篇文章到此結(jié)束。在下一篇文章中,我們將對(duì)輸入到機(jī)器學(xué)習(xí)模型中的數(shù)據(jù)集進(jìn)行預(yù)處理。
以上就是c# 使用OpenCV識(shí)別硬幣的詳細(xì)內(nèi)容,更多關(guān)于c# opencv識(shí)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- c# 開(kāi)發(fā)文字識(shí)別軟件
- c# 開(kāi)發(fā)語(yǔ)音識(shí)別程序
- C# Winform調(diào)用百度接口實(shí)現(xiàn)人臉識(shí)別教程(附源碼)
- C# 10分鐘完成百度人臉識(shí)別(入門篇)
- C# SDK實(shí)現(xiàn)百度云OCR的文字識(shí)別功能
- C# winform程序?qū)崿F(xiàn)開(kāi)機(jī)自啟動(dòng)并且識(shí)別是開(kāi)機(jī)啟動(dòng)還是雙擊啟動(dòng)
- C#二維碼圖片識(shí)別代碼
- C#圖像識(shí)別 微信跳一跳機(jī)器人
- .NET/C#實(shí)現(xiàn)識(shí)別用戶訪問(wèn)設(shè)備的方法
- .NET C#利用ZXing生成、識(shí)別二維碼/條形碼
- C#如何自動(dòng)識(shí)別文件的編碼
- c# 圓形識(shí)別方案和直線識(shí)別方案的參考示例
相關(guān)文章
Unity Sockect實(shí)現(xiàn)畫(huà)面實(shí)時(shí)傳輸案例原理解析
Socket是比較常用的一種通信方式,本文通過(guò)案例給大家介紹Unity Sockect實(shí)現(xiàn)畫(huà)面實(shí)時(shí)傳輸功能,感興趣的朋友一起看看吧2021-08-08
C# Winform調(diào)用百度接口實(shí)現(xiàn)人臉識(shí)別教程(附源碼)
這篇文章主要介紹了C# Winform調(diào)用百度接口實(shí)現(xiàn)人臉識(shí)別教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
C#利用正則表達(dá)式實(shí)現(xiàn)獲取字符串中漢字的數(shù)量
這篇文章主要為大家詳細(xì)介紹了C#如何利用正則表達(dá)式實(shí)現(xiàn)獲取字符串中漢字的數(shù)量,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
C#使用Win2D在UWP程序中實(shí)現(xiàn)2D繪圖
這篇文章介紹了C#使用Win2D在UWP程序中實(shí)現(xiàn)2D繪圖的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
C#實(shí)現(xiàn)掃描局域網(wǎng)內(nèi)的所有IP和端口
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)掃描局域網(wǎng)內(nèi)的所有IP和端口的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12
C# 文件上傳下載(Excel導(dǎo)入,多線程下載)功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了C# 文件上傳下載(Excel導(dǎo)入,多線程下載)功能的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-08-08

