Opencv Sharp 基于灰度模板的多目标匹配
基于opencv 的灰度模板匹配,其原装函数只能匹配一个目标,本人通过对其进行简单的封装,以实现一次匹配多个目标:
先上效果:
模板图片:
效果:经过本人的实际测试,效果还是稳定的。opencv 的灰度模板极容易出现错误匹配,需要根据实际应用条件来进行进一步处理,这个因项目实际而异,有兴趣我们可以私下讨论。(下面为本人项目用图,匹配的稳定已经根据实际进行再次处理。当然,需要图片也可以传给你几张!)
对于类似简单的工业应用,opencv sharp基本都可以胜任哦.
好了,时间有限。上代码,多目标匹配关键代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
有问题可以联系我,相互讨论学习,进步。