C#(结合OpenCvSharp)之模板跟踪

@C# (结合Opencvsharp)之模板跟踪

本文为大家介绍一个用C#结合opencvsharp写的一个关于模板跟踪的小程序,希望对初学图像处理的小伙伴能有所帮助,本人也是刚刚起步,不足之处还请各位海涵哦。

##该小程序实现摄像头实时捕获目标图像``
模板跟踪就是指定一个模板,然后在目标区域内实时捕获目标对象。我用的是Visual Studio 2017。
基本原理是通过模板图像与每一帧摄像头画面进行模板匹配并标定,达到目标跟踪的目的。
1、创建新项目后,首先要下载opencvsharp的库
工具——Nuget包管理器——管理解决方案——搜索opencvsahrp,点击安装(一般用opencvsharp3-anyCPU比较多)——在头文件里加上opencvsharp库(接下来就可以调用了)
在这里插入图片描述
在这里插入图片描述
2、接下来就是打开摄像头,打开模板图像,扫描摄像头的每一帧画面并标记目标图像(即与模板图像相似度最大的区域)
##以下是完整代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace Cvsharp_track2
{
    class Program
    {
        static VideoCapture cap = new VideoCapture();

        static void Main(string[] args)
        {
            //输入模板(即输入图像图片所在地址),注意这里的模板图像大小不能超过目标图像
            Mat dst = new Mat(@"D:\文件\1.jpg", ImreadModes.AnyColor);
            //创建result的模板,就是MatchTemplate里的第三个参数
            Mat mat = new Mat();

            OpenCvSharp.Point minLocation, maxLocation;

            //摄像头画面capMat
            Mat capMat = new Mat();
            FrameSource frame = Cv2.CreateFrameSource_Camera(0);

            
            //Cv2.ImShow("mat1", capMat);
            //Cv2.ImShow("mat2", dst);

            //Runvideo();

            //实现模板跟踪(通过模板图像与摄像头画面每一帧进行扫描匹配)
            cap.Open(0);
            if (!cap.IsOpened()) return;

            while (true)
            {
                capMat = cap.RetrieveMat();
                //Mat mat2 = new Mat();
                frame.NextFrame(capMat);
                //Cv2.Canny(capMat,mat2,50,150);
                
                //板匹配并标记
                mat.Create(capMat.Cols - dst.Cols + 1, capMat.Rows - dst.Cols + 1, MatType.CV_32FC1);//创建模板mat
                Cv2.MatchTemplate(capMat, dst, mat, TemplateMatchModes.SqDiff);
                Cv2.Normalize(mat, mat, 1, 0, NormTypes.MinMax, -1);
                //Point minLocation, maxLocation;
                //寻找最大最小值
                Cv2.MinMaxLoc(mat, out minLocation, out maxLocation);
                //画出匹配的矩形标记
                Cv2.Rectangle(capMat, minLocation, new Point(minLocation.X + dst.Cols, minLocation.Y + dst.Rows), Scalar.Red, 2);
                

                Cv2.ImShow("video", capMat);  //显示
                Cv2.ImShow("目标图像", dst);
                Cv2.WaitKey(20);
            }
        }    
    }
}

这是效果图
这是效果图

猜你喜欢

转载自blog.csdn.net/m0_45376718/article/details/103482421
今日推荐