zoukankan      html  css  js  c++  java
  • Opencv Sharp 基于灰度模板的多目标匹配

    基于opencv 的灰度模板匹配,其原装函数只能匹配一个目标,本人通过对其进行简单的封装,以实现一次匹配多个目标:

    先上效果:

    模板图片:

    效果:经过本人的实际测试,效果还是稳定的。opencv 的灰度模板极容易出现错误匹配,需要根据实际应用条件来进行进一步处理,这个因项目实际而异,有兴趣我们可以私下讨论。(下面为本人项目用图,匹配的稳定已经根据实际进行再次处理。当然,需要图片也可以传给你几张!)

    对于类似简单的工业应用,opencv sharp基本都可以胜任哦.

    好了,时间有限。上代码,多目标匹配关键代码:

     1  /// <summary>
     2         /// 用同一个模板来匹配多个相似目标,函数返回为多个目标对应的分数。
     3         /// </summary>
     4         /// <param name="srcimg">输入图片</param>
     5         /// <param name="templateimg">输入模板</param>
     6         /// <param name="Target_Point_list">输出多个目标的中心点位置</param>
     7         /// <param name="findtarget_count">需要匹配的目标数量,默认是1</param>
     8         /// <returns></returns>
     9         public static List<double>  MatcheAndFindMultiTarget(Mat srcimg, Mat templateimg, out List<Point> Target_Point_list, int findtarget_count=1)
    10         {
    11 
    12             List<double> allscore = new List<double>();
    13             Target_Point_list = new List<Point>();
    14             double minvalue = 0;
    15             double maxvalue = 0;
    16         
    17             Mat matchresult2 = new Mat();
    18             Cv2.MatchTemplate(srcimg, templateimg, matchresult2, TemplateMatchModes.CCorrNormed);
    19             Point minLoc;
    20             //寻找最几个最值的位置
    21             Mat mask = new Mat(matchresult2.Height, matchresult2.Width, MatType.CV_8UC1, Scalar.White);
    22             Mat mask_sub = new Mat(matchresult2.Height, matchresult2.Width, MatType.CV_8UC1, Scalar.Black);
    23             var Target_Point = new Point(0, 0);
    24             for (int i=0;i<findtarget_count;i++)
    25             {
    26                 Target_Point = default;
    27               
    28                 Cv2.MinMaxLoc(matchresult2, out minvalue, out maxvalue, out minLoc, out Target_Point, mask);
    29                 Rect maskrect = new Rect(Target_Point.X-templateimg.Width/2, Target_Point.Y-templateimg.Height/2, templateimg.Width, templateimg.Height);
    30                 mask_sub.Rectangle(maskrect, Scalar.White,-1);
    31                 mask = mask - mask_sub;
    32               //  mask.Set<float>(Target_Point.Y, Target_Point.X, 0.0f);
    33                 //转中心
    34                 Target_Point = Target_Point + new Point(templateimg.Width / 2, templateimg.Height / 2);
    35                 //位置
    36                 Target_Point_list.Add(Target_Point);
    37                 //分数
    38                 allscore.Add(100 * maxvalue);
    39             }        
    40 
    41          
    42             //输出最大分数
    43             matchresult2.Dispose();
    44             mask.Dispose();
    45             mask_sub.Dispose();
    46             return allscore;
    47         }
    MatcheAndFindMultiTarget

    有问题可以联系我,相互讨论学习,进步。

  • 相关阅读:
    第一次作业
    java基础随笔09
    java基础随笔08
    java基础随笔07
    java基础随笔06
    java基础随笔05
    java基础随笔04
    java基础随笔03
    java基础随笔02
    java基础随笔01
  • 原文地址:https://www.cnblogs.com/banluqiaodaima/p/14424370.html
Copyright © 2011-2022 走看看