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 }

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