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

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

 

posted on 2021-02-21 10:29  半路敲代码  阅读(3051)  评论(0编辑  收藏  举报

导航