本文为大家介绍一个用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);
}
}
}
}
这是效果图