OpenCVSharp学习之模板匹配

更新时间:2023-07-14 07:55:47 阅读: 评论:0

OpenCVSharp学习之模板匹配
老虎菜的做法1:建好测试Demo
C#项⽬中添加好OpenCVSharp安装包 如下图(图中是VS2015版本)
NuGet⼯具给项⽬添加OpenCvSharp3-AnyCPU:
⼯具>>NuGet包管理器>>管理解决⽅案的NuGet程序包
2:测试Demo
⾸先,添加引⽤:using OpenCvSharp;
其次,添加如下函数代码代码段
对模板匹配⽅法使⽤前的准备
/// <summary>
老师寄语简短/// 模板匹配
/// </summary>
/// <param name="srcImg">被匹配图像路径</param>
/// <param name="tempImg">模板图像路径</param>
/// <returns>当前匹配完成后模板在匹配图像中左上⾓的坐标点</returns>
public OpenCvSharp.Point TemplateMatch(string srcImg, string tempImg, out double matchVal)
海贼王战力排行榜
销售商品的会计分录
{
OpenCvSharp.Point tempPoint = new OpenCvSharp.Point();
Mat srcImage = Cv2.ImRead(srcImg, ImreadModes.Grayscale);
Mat tempImage = Cv2.ImRead(tempImg, ImreadModes.Grayscale);
Bitmap bmp = MatchTemplate(tempImage, srcImage, out tempPoint, out matchVal);
//保存图像路径
bmp.Save(System.AppDomain.CurrentDomain.BaDirectory + @"ImgFile\procesdImg" + DateTime.Now.ToString("yyMMddHHmmss") + ".bmp");
return tempPoint;
}
模板匹配⽅法
/// <summary>
/// 模板匹配
/// </summary>
/// <param name="tempalte">模板图⽚像</param>
/// <param name="srcPic">被匹配图像</param>
/// <param name="tempPoint">返回模板图像在匹配图像中的坐标位置</param>
/// <returns>标注匹配区域的图像</returns>
private Bitmap MatchTemplate(Mat tempalte, Mat srcPic, out OpenCvSharp.Point tempPoint, out double matchValue)
{
Mat result = new Mat();
//模板匹配
Cv2.MatchTemplate(srcPic, tempalte, result, TemplateMatchModes.CCoeffNormed);//CCoeffNormed  最好匹配为1,值越⼩匹配越差
Double minVul;
Double maxVul;
OpenCvSharp.Point minLoc = new OpenCvSharp.Point(0, 0);
OpenCvSharp.Point maxLoc = new OpenCvSharp.Point(0, 0);
述廉述职报告OpenCvSharp.Point matchLoc = new OpenCvSharp.Point(0, 0);
//归⼀化
Cv2.Normalize(result, result, 0, 1, NormTypes.MinMax, -1);
//寻找极值
Cv2.MinMaxLoc(result, out minVul, out maxVul, out minLoc, out maxLoc);
//最⼤值坐标
matchLoc = maxLoc;
Mat mask = srcPic.Clone();//复制整个矩阵
曲焕章//画框显⽰ :对⾓线画框,起点和终点,都⽤Point,线宽
Cv2.Rectangle(mask, matchLoc, new OpenCvSharp.Point(matchLoc.X + tempalte.Cols, matchLoc.Y + tempalte.Rows), Scalar.Green, 2);//2代表画的线
//Console.WriteLine("最⼤值:{0},X:{1},Y:{2}", maxVul, matchLoc.Y, matchLoc.X);
matchValue = maxVul;
tempPoint.X = matchLoc.X;
tempPoint.Y = matchLoc.Y;
//循环查找画框显⽰
Double threshold = 0.91;
Mat maskMulti = srcPic.Clone();
for (int i = 1; i < result.Rows - tempalte.Rows; i += tempalte.Rows)
{
for (int j = 1; j < result.Cols - tempalte.Cols; j += tempalte.Cols)
{
Rect roi = new Rect(j, i, tempalte.Cols, tempalte.Rows);        //建⽴感兴趣
Mat RoiResult = new Mat(result, roi);
Cv2.MinMaxLoc(RoiResult, out minVul, out maxVul, out minLoc, out maxLoc);//查找极值
matchLoc = maxLoc;//最⼤值坐标
if (maxVul > threshold)
{
//画框显⽰
Cv2.Rectangle(maskMulti, new OpenCvSharp.Point(j + maxLoc.X, i + maxLoc.Y), new OpenCvSharp.Point(j + maxLoc.X + tempalte.Cols, i +                        string axis = '(' + Convert.ToString(i + maxLoc.Y) + ',' + Convert.ToString(j + maxLoc.X) + ')';
Cv2.PutText(maskMulti, axis, new OpenCvSharp.Point(j + maxLoc.X, i + maxLoc.Y), HersheyFonts.HersheyPlain, 1, Scalar.Red, 1, LineTypes                    }
}
}
//返回匹配后图像故事与酒
return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mask);
诛仙淫传}
3:测试结果
被匹配图像
模板图像
匹配结果
效果可以滴,但是经过多次不同程度实验结果表明,误差还是有的3:学习资料
OpenCv中⽂⽹站:
OpenCV官⽅教程 -Template Matching:

本文发布于:2023-07-14 07:55:47,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1095776.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:匹配   图像   模板   添加   画框   查找   函数   代码段
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图