日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C# 图像模板匹配并标注

發(fā)布時(shí)間:2023/12/4 C# 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 图像模板匹配并标注 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

01

需求

這個(gè)是粉絲在我的技術(shù)群提的一個(gè)需求

1、 模板匹配 :

功能:

? (1)在一張大圖像中,選取一小塊區(qū)域作為模板

? (2)可在大圖像中匹配到模板圖像和位置。

模板匹配是圖像處理中最基本、最常用的匹配方法。目前我司用hacon去做的,還進(jìn)行了二次封裝,可以設(shè)置圖片的旋轉(zhuǎn)角度等信息,這個(gè)設(shè)計(jì)公司機(jī)密,這里我就用opencv(NET封裝版叫emgucv)去實(shí)現(xiàn)這個(gè)功能。

02


功能演示

03


核心代碼

using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure; using PropertyChanged; using System; using System.Drawing; using System.IO; using System.Text; using System.Windows.Forms; using System.Windows.Media; using System.Windows.Media.Imaging;namespace Caliburn.Micro.Hello {[AddINotifyPropertyChangedInterface]public class MatchTemplateViewModel: IViewModel{public ImageSource TemplateImage { get; set; }public string TemplateImagePath { get; set; }public ImageSource MarkImage { get; set; }public string MarkImagePath { get; set; }public string ResultString { get; set; }public void MatchTemplate(){Mat src = CvInvoke.Imread(TemplateImagePath, LoadImageType.AnyColor);//從本地讀取圖片Mat result = src.Clone();Mat tempImg = CvInvoke.Imread(MarkImagePath, LoadImageType.AnyColor);int matchImg_rows = src.Rows - tempImg.Rows + 1;int matchImg_cols = src.Cols - tempImg.Cols + 1;Mat matchImg = new Mat(matchImg_rows, matchImg_rows, DepthType.Cv32F, 1); //存儲(chǔ)匹配結(jié)果#region 模板匹配參數(shù)說(shuō)明采用系數(shù)匹配法,匹配值越大越接近準(zhǔn)確圖像。IInputArray image:輸入待搜索的圖像。圖像類(lèi)型為8位或32位浮點(diǎn)類(lèi)型。設(shè)圖像的大小為[W, H]。IInputArray templ:輸入模板圖像,類(lèi)型與待搜索圖像類(lèi)型一致,并且大小不能大于待搜索圖像。設(shè)圖像大小為[w, h]。IOutputArray result:輸出匹配的結(jié)果,單通道,32位浮點(diǎn)類(lèi)型且大小為[W - w + 1, H - h + 1]。TemplateMatchingType method:枚舉類(lèi)型標(biāo)識(shí)符,表示匹配算法類(lèi)型。Sqdiff = 0 平方差匹配,最好的匹配為 0。SqdiffNormed = 1 歸一化平方差匹配,最好效果為 0。Ccorr = 2 相關(guān)匹配法,數(shù)值越大效果越好。CcorrNormed = 3 歸一化相關(guān)匹配法,數(shù)值越大效果越好。Ccoeff = 4 系數(shù)匹配法,數(shù)值越大效果越好。CcoeffNormed = 5 歸一化系數(shù)匹配法,數(shù)值越大效果越好。#endregionCvInvoke.MatchTemplate(src, tempImg, matchImg, TemplateMatchingType.CcoeffNormed);#region 歸一化函數(shù)參數(shù)說(shuō)明IInputArray src:輸入數(shù)據(jù)。IOutputArray dst:進(jìn)行歸一化后輸出數(shù)據(jù)。double alpha = 1; 歸一化后的最大值,默認(rèn)為 1。double beta = 0:歸一化后的最小值,默認(rèn)為 0。#endregionCvInvoke.Normalize(matchImg, matchImg, 0, 1, NormType.MinMax, matchImg.Depth); //歸一化double minValue = 0.0, maxValue = 0.0;Point minLoc = new Point();Point maxLoc = new Point();#region 極值函數(shù)參數(shù)說(shuō)明IInputArray arr:輸入數(shù)組。ref double minVal:輸出數(shù)組中的最小值。ref double maxVal; 輸出數(shù)組中的最大值。ref Point minLoc:輸出最小值的坐標(biāo)。ref Point maxLoc; 輸出最大值的坐標(biāo)。IInputArray mask = null:蒙版。#endregionCvInvoke.MinMaxLoc(matchImg, ref minValue, ref maxValue, ref minLoc, ref maxLoc);StringBuilder tb_result = new StringBuilder();tb_result.Append("min=" + minValue + ",max=" + maxValue);tb_result.Append(Environment.NewLine);tb_result.Append("最小值坐標(biāo):\n" + minLoc.ToString());tb_result.Append(Environment.NewLine);tb_result.Append("最大值坐標(biāo):\n" + maxLoc.ToString());ResultString = tb_result.ToString();//Console.WriteLine(tb_result);CvInvoke.Rectangle(src, new Rectangle(maxLoc, tempImg.Size), new MCvScalar(0, 0, 255), 3);//繪制矩形,匹配得到的效果。CvInvoke.Imshow("result", src);CvInvoke.WaitKey(0);}/// <summary>/// 加載模板圖片/// </summary>public void LoadTemplateImage(){TemplateImage = LoadImage(ImageLoadType.TemplateImage);}/// <summary>/// 加載標(biāo)記圖片/// </summary>public void LoadMarkImage(){MarkImage = LoadImage(ImageLoadType.MarkImage);}public ImageSource LoadImage(ImageLoadType imageType ){OpenFileDialog openFileDialog1 = new OpenFileDialog();openFileDialog1.Filter = "圖片|*.jpg;*.jpeg;*.bmp;*.png;*.gif";openFileDialog1.FilterIndex = 1;//當(dāng)前使用第二個(gè)過(guò)濾字符串openFileDialog1.RestoreDirectory = true;//對(duì)話框關(guān)閉時(shí)恢復(fù)原目錄openFileDialog1.Multiselect = false;openFileDialog1.Title = "選擇文件";ImageSource iSouce = null;try{if (openFileDialog1.ShowDialog() == DialogResult.OK){iSouce = LoadImageFreeze(openFileDialog1.FileName);//加載顯示完成需要釋放switch(imageType){case ImageLoadType.MarkImage:MarkImagePath = openFileDialog1.FileName;break;case ImageLoadType.TemplateImage:TemplateImagePath = openFileDialog1.FileName; break;default: break;}return iSouce;}return null;}catch (Exception ex){Console.WriteLine($"[MatchTemplateViewModel]:Load() execute error:{ex}");return null;}}/// <summary>/// 圖片加載顯示完成后釋放/// </summary>/// <param name="imagePath"></param>/// <returns></returns>public static BitmapImage LoadImageFreeze(string imagePath){try{BitmapImage bitmap = new BitmapImage();if (File.Exists(imagePath)){bitmap.BeginInit();bitmap.CacheOption = BitmapCacheOption.OnLoad;using (Stream ms = new MemoryStream(File.ReadAllBytes(imagePath))){bitmap.StreamSource = ms;bitmap.EndInit();bitmap.Freeze();}}return bitmap;}catch (Exception){return null;}}} }

04


說(shuō)明

界面分別加載模板圖片和標(biāo)記圖片,然后點(diǎn)擊匹配按鈕進(jìn)行匹配,匹配結(jié)果在模板圖片上用矩形標(biāo)注,并把位置信息顯示在界面上

①在NUGET上安裝emgucv庫(kù):我這里適應(yīng)的是3.1。0.1,注意emgucv每個(gè)版本不兼容

②模板匹配接口MatchTemplate說(shuō)明,詳細(xì)注釋代碼里面都有

#region 模板匹配參數(shù)說(shuō)明采用系數(shù)匹配法,匹配值越大越接近準(zhǔn)確圖像。IInputArray image:輸入待搜索的圖像。圖像類(lèi)型為8位或32位浮點(diǎn)類(lèi)型。設(shè)圖像的大小為[W, H]。IInputArray templ:輸入模板圖像,類(lèi)型與待搜索圖像類(lèi)型一致,并且大小不能大于待搜索圖像。設(shè)圖像大小為[w, h]。IOutputArray result:輸出匹配的結(jié)果,單通道,32位浮點(diǎn)類(lèi)型且大小為[W - w + 1, H - h + 1]。TemplateMatchingType method:枚舉類(lèi)型標(biāo)識(shí)符,表示匹配算法類(lèi)型。Sqdiff = 0 平方差匹配,最好的匹配為 0。SqdiffNormed = 1 歸一化平方差匹配,最好效果為 0。Ccorr = 2 相關(guān)匹配法,數(shù)值越大效果越好。CcorrNormed = 3 歸一化相關(guān)匹配法,數(shù)值越大效果越好。Ccoeff = 4 系數(shù)匹配法,數(shù)值越大效果越好。CcoeffNormed = 5 歸一化系數(shù)匹配法,數(shù)值越大效果越好。#endregionCvInvoke.MatchTemplate(src, tempImg, matchImg, TemplateMatchingType.CcoeffNormed);

③外部加載?圖片,加載顯示完成后釋放,返回BitmapImage 可以直接賦值給wpf控件的ImageSource

public static BitmapImage LoadImageFreeze(string imagePath){try{BitmapImage bitmap = new BitmapImage();if (File.Exists(imagePath)){bitmap.BeginInit();bitmap.CacheOption = BitmapCacheOption.OnLoad;using (Stream ms = new MemoryStream(File.ReadAllBytes(imagePath))){bitmap.StreamSource = ms;bitmap.EndInit();bitmap.Freeze();}}return bitmap;}catch (Exception){return null;}}

總結(jié)

以上是生活随笔為你收集整理的C# 图像模板匹配并标注的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。