问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

OpenCvSharp模板匹配实战:Cv2.MatchTemplate方法详解

创作时间:
作者:
@小白创作中心

OpenCvSharp模板匹配实战:Cv2.MatchTemplate方法详解

引用
CSDN
1.
https://blog.csdn.net/FL1768317420/article/details/137365239

OpenCvSharp是OpenCV的C#封装,提供了丰富的计算机视觉功能。其中,模板匹配是一种常用的图像处理技术,用于在一幅图像中查找与给定模板最相似的区域。本文将详细介绍OpenCvSharp中的模板匹配方法Cv2.MatchTemplate,并给出具体的使用示例。

Cv2.MatchTemplate 方法详解

Cv2.MatchTemplate方法通过在输入图像中滑动模板图像并计算每个位置的匹配度来查找模板的位置。匹配度通常使用平方差或相关性等指标来度量,具体取决于所选择的匹配方法。

方法签名

void Cv2.MatchTemplate(InputArray image, 
                       InputArray templ, 
                       OutputArray result, 
                       TemplateMatchModes method, 
                       InputArray mask = null)  
  • image:输入图像,你希望在其中查找模板的图像。通常,这是一幅较大的图像。
  • templ:要查找的模板图像,你希望在输入图像中匹配的部分。
  • result:输出结果图像,它将包含匹配度信息。这是一个单通道浮点型图像。
  • method:匹配方法,一个枚举值,用于选择不同的匹配算法。常用的选项有:
  • TemplateMatchModes.SqDiff:平方差匹配。返回最小平方差的位置。
  • TemplateMatchModes.CCoeffNormed:相关性匹配。返回最大相关性的位置。
  • mask(可选):用于指定模板匹配的掩码图像。如果不需要,可以设置为 null

获取匹配位置

为了从匹配结果中获取最佳匹配的位置,可以使用Cv2.MinMaxLoc方法:

public static void MinMaxLoc(Mat src, 
                             out double minVal, 
                             out double maxVal, 
                             out Point minLoc, 
                             out Point maxLoc, 
                             Mat mask = null);  
  • src:输入图像,通常是一个单通道图像(灰度图像)。
  • minVal:输出参数,用于存储图像中的最小值。
  • maxVal:输出参数,用于存储图像中的最大值。
  • minLoc:输出参数,用于存储最小值的位置。
  • maxLoc:输出参数,用于存储最大值的位置。
  • mask(可选参数):用于指定感兴趣区域的掩码图像。如果不需要使用掩码,可以将其设置为 null

实际应用示例

下面是一个完整的C#代码示例,展示了如何使用Cv2.MatchTemplate方法在图像中查找模板:

using OpenCvSharp;
using System;

namespace 模板匹配
{
    class Program
    {
        static void Main(string[] args)
        {
            // 定义输入图像路径和模板图像路径
            string srcImgPath = "C:/Users/CGW/Desktop/digits/0.1.jpg";
            string tempImgPath = "C:/Users/CGW/Desktop/digits/0.4.jpg";

            // 读取输入图像和模板图像
            Mat srcImage = Cv2.ImRead(srcImgPath, ImreadModes.AnyColor);
            Mat tempImage = Cv2.ImRead(tempImgPath, ImreadModes.AnyColor);

            // 创建用于存储模板和匹配结果的图像
            Mat result = new Mat();

            // 使用模板匹配方法进行匹配,这里使用归一化相关系数匹配法
            Cv2.MatchTemplate(srcImage, tempImage, result, TemplateMatchModes.CCoeffNormed);

            // 获取匹配结果中的最小值、最大值以及对应的位置
            double minVal, maxVal;
            OpenCvSharp.Point minLoc, maxLoc;
            Cv2.MinMaxLoc(result, out minVal, out maxVal, out minLoc, out maxLoc);

            // 获取最佳匹配的位置
            OpenCvSharp.Point matchLoc = maxLoc;

            // 在输入图像上用绿色矩形框标记匹配的位置
            Cv2.Rectangle(srcImage, matchLoc, new OpenCvSharp.Point(matchLoc.X + tempImage.Cols, matchLoc.Y + tempImage.Rows), Scalar.Green, 2);

            // 显示模板和匹配结果的图像
            Cv2.ImShow("模板", tempImage);
            Cv2.ImShow("Matched Result", srcImage);

            Cv2.WaitKey(0);

            // 释放图像对象,关闭显示窗口
            srcImage.Release();
            tempImage.Release();
            result.Release();
            Cv2.DestroyAllWindows();
            Cv2.DestroyAllWindows();
        }
    }
}

结果显示

通过上述代码,可以在输入图像中准确地定位模板图像的位置,并用绿色矩形框标记出来。这种方法在图像处理和计算机视觉领域有着广泛的应用,例如目标检测、特征匹配等场景。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号