OpenCvSharp-轮廓形状匹配/模板查找1.0(附源码)

这篇具有很好参考价值的文章主要介绍了OpenCvSharp-轮廓形状匹配/模板查找1.0(附源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言:

 一、函数讲解:

图像阈值处理:Cv2.Threshold()

查找轮廓 Cv2.FindContours()

最小外接矩形 Cv2.BoundingRect();

绘制轮廓 Cv2.DrawContours()

 计算轮廓相似度 Cv2.MatchShapes()

二、代码(教学注释详细,仔细阅读)

三、代码过程总结:


前言:

轮廓匹配是一种计算机视觉技术,用于在图像中查找和比较目标轮廓与待匹配轮廓之间的相似度

 一、函数讲解:

图像阈值处理:Cv2.Threshold()

用于将图像中的像素值根据阈值分成两个不同的区域,可以用来实现图像的分割、边缘检测等任务。

Cv2.Threahold(Mat src, Mat dst ,double thresh, double maxval, ThresholdTypes type)
  • src: 输入的源图像,通常是一个单通道灰度图像。
  • dst: 输出的目标图像,与源图像具有相同的尺寸和类型。
  • thresh: 阈值,用于将图像中的像素值进行分类。
  • maxval: 阈值之后的像素值要设置的新值。
  • type: 阈值处理的类型,有不同的处理方式,比如二进制阈值、反二进制阈值、截断阈值等。

常见的阈值处理类型包括:

  • ThresholdTypes.Binary: 如果像素值大于等于阈值,则设置为 maxval,否则为 0。
  • ThresholdTypes.BinaryInv: 如果像素值小于阈值,则设置为 maxval,否则为 0。
  • ThresholdTypes.Trunc: 如果像素值大于等于阈值,则保持原值,否则截断为阈值。
  • ThresholdTypes.ToZero: 如果像素值大于等于阈值,则保持原值,否则设置为 0。
  • ThresholdTypes.ToZeroInv: 如果像素值小于阈值,则保持原值,否则设置为 0。
  • ThresholdTypes.Otsu大津法,是一种自动确定图像二值化阈值的方法,它能够将图像的像素分成两个类别,使得类别内方差最小、类别间方差最大。这个方法非常适用于背景与前景之间对比明显的图像。
  • ThresholdTypes.Triangle:三角法,基于图像直方图的阈值选择方法,通过寻找直方图中的一条直线,将直方图分成两个部分,使得两个部分之间的面积最小,从而得到阈值。

Point[][] contours:二维数组表示多个轮廓,每个轮廓由一组点坐标组成,因此 contours变量 存储了多个轮廓。

HierarchyIndex[] hierarchy :用hierarchy变量存储轮廓之间拓扑关系的数据结构

查找轮廓 Cv2.FindContours()

返回一组轮廓数组 contours和轮廓的拓扑结构hierarchy

Point[][] contours; // 存储轮廓的点坐标数组
HierarchyIndex[] hierarchy; // 存储轮廓之间的拓扑关系

Cv2.FindContours(
    input: binaryImage, // 二值化图像,白色像素表示物体,黑色像素表示背景
    contours: out contours, // 存储找到的轮廓点坐标
    hierarchy: out hierarchy, // 存储轮廓之间的拓扑关系
    mode: RetrievalModes.External, // 轮廓检索模式,这里表示只检索外部轮廓
    method: ContourApproximationModes.ApproxNone // 轮廓逼近方法,这里表示不逼近轮廓
);
  • input: 二值化图像,即图像中的物体被标记为白色,背景被标记为黑色。
  • contours: 用于存储找到的轮廓的点坐标数组。每个轮廓由一组点构成。
  • hierarchy: 用于存储轮廓之间的拓扑关系,例如父子关系、前后关系等。
  • mode: 轮廓检索模式,可以是 RetrievalModes.List(检索所有轮廓)或 RetrievalModes.External(只检索外部轮廓)等。
  • method: 轮廓逼近方法,可以是 ContourApproximationModes.ApproxNone(不逼近轮廓)、ContourApproximationModes.ApproxSimple(简化轮廓)等。
最小外接矩形 Cv2.BoundingRect();
Rect 变量名 = Cv2.BoundingRect(InputArray points);

 points 是输入的轮廓点集,可以是一个 Point[]Mat

  返回一个 Rect 对象,表示计算得到的最小外接矩形。矩形由左上角坐标 (x, y) 和矩形的宽度和  高度 (width, height) 组成。

绘制轮廓 Cv2.DrawContours()
void Cv2.DrawContours(Mat image, IEnumerable<IEnumerable<Point>> contours, int contourIdx, Scalar color, int thickness = 1, LineTypes lineType = LineTypes.Link8, Mat? hierarchy = null, int maxLevel = int.MaxValue, Point? offset = null);
  • image:目标图像,轮廓将绘制在这个图像上。
  • contours:要绘制的轮廓列表,可以是一个包含 Point 数组的集合。
  • contourIdx:要绘制的轮廓的索引。
    正数值(0、1、2..):表示你要绘制的具体轮廓的索引。如果有多个轮廓,你可以选择其中一个来绘制;
    负数(-1):表示绘制所有的轮廓。这时会绘制 contours 列表中的所有轮廓。
  • color:绘制轮廓的颜色。
  • thickness:轮廓线的宽度,其余为默认
     = 1
    绘制细线,通常是轮廓的默认值。这是最常见的用法。
     > 1 绘制较粗的线。增加线宽度可以使轮廓更加突出。
     = -1 填充轮廓内部。这样可以创建一个实心的轮廓。
Cv2.MatchShapes()形状匹配
double Cv2.MatchShapes(InputArray contour1, InputArray contour2, ContourMatchModes method, double parameter = 0);
  • contour1:第一个轮廓的点集,可以是一个 Point[]Mat
  • contour2:第二个轮廓的点集,可以是一个 Point[]Mat
  • method:计算相似性的方法,可以是 ContourMatchModes 枚举中的一个选项。
  • parameter:计算方法所需的参数。
  •  用于选择形状匹配的方法:
  • ShapeMatchModes.I1:使用I1方法计算形状相似性。
  • ShapeMatchModes.I2:使用I2方法计算形状相似性。
  • ShapeMatchModes.I3:使用I3方法计算形状相似性。

返回值:该方法返回一个 double 类型的相似性度量值,用于表示两个轮廓之间的相似性。值越小,表示形状越相似。文章来源地址https://www.toymoban.com/news/detail-782775.html

二、代码(教学注释详细,仔细阅读)

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


namespace 轮廓匹配查找模板
{
    class Program
    {
        static void Main(string[] args)
        {
            //读取图像
            Mat template = Cv2.ImRead("C:/Users/CGW/source/repos/轮廓匹配查找模板_Color Space/轮廓匹配查找模板_Color Space/imgs/0.bmp"); //读取模板图像
            Mat imgTest = Cv2.ImRead("C:/Users/CGW/source/repos/轮廓匹配查找模板_Color Space/轮廓匹配查找模板_Color Space/imgs/4.bmp"); //读取测试图像

            Mat grayTemp = new Mat(); // 模板图像
            Mat grayTest = new Mat(); // 测试图像

            //转换为灰度图
            Cv2.CvtColor(template, grayTemp, ColorConversionCodes.BGR2GRAY);
            Cv2.CvtColor(imgTest, grayTest, ColorConversionCodes.BGR2GRAY);

            //二值化--分割轮廓区域
            Cv2.Threshold(grayTemp, grayTemp, 90, 255, ThresholdTypes.Binary);
            Cv2.Threshold(grayTest, grayTest, 90, 255, ThresholdTypes.Binary);

            Point[][] contours; // 存储轮廓的变量
            HierarchyIndex[] hierarchy; // 存储轮廓拓扑结构的变量

            // 使用 FindContours 函数查找图像中的轮廓,返回一组轮廓数组 contours,同时还可以获得轮廓的拓扑结构。
            Cv2.FindContours(grayTemp, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxNone);

            int index = 0; // 模板中十字轮廓的轮廓序号
            //遍历每个轮廓
            for (int i = 0; i < contours.Length; i++)
            {
                // 获取轮廓的外接矩形
                Rect rect = Cv2.BoundingRect(contours[i]);

                // 判断轮廓是否满足条件,比如宽度和高度都大于80像素
                if (rect.Width > 80 && rect.Height > 80)
                {
                    index = i; // 记录找到的目标轮廓的索引
                    // 在模板图像上绘制找到的目标轮廓,标记为红色
                    Cv2.DrawContours(template, contours, i, new Scalar(0, 0, 255), -1);
                    break; // 找到目标轮廓后跳出循环
                }
            }
            Cv2.ImShow("template", template);

            //遍历测试图像中的轮廓做轮廓匹配
            Point[][] contours2; //轮廓查找结果变量
            HierarchyIndex[] hierarchy2; //轮廓拓扑结构变量

            Cv2.FindContours(grayTest, out contours2, out hierarchy2, RetrievalModes.External,
                                            ContourApproximationModes.ApproxNone);

            //Console.WriteLine("contour2_size = {0}", contours2.Length); //输出轮廓个数
            for (int i = 0; i < contours2.Length; i++)
            {
                Rect rect = Cv2.BoundingRect(contours2[i]);

                //宽高与模板轮廓宽高相符的才做轮廓匹配,剔除干扰轮廓
                if (rect.Width >= 80 && rect.Width <= 100 && rect.Height > 80 && rect.Height <= 100) //找到目标轮廓,跳出循环
                {
                    // 计算轮廓匹配值
                    double matchValue = Cv2.MatchShapes(contours[index], contours2[i], ShapeMatchModes.I3);
                    // 输出匹配值
                    Console.WriteLine("matchRate = {0}", matchValue);
                    // 如果匹配值在一定阈值内,绘制匹配的轮廓
                    if (matchValue <= 2)
                        Cv2.DrawContours(imgTest, contours2, i, new Scalar(0, 255, 0), -1);
                }
            }
            Cv2.ImShow("match-result", imgTest);
            Cv2.WaitKey(0);
        }
    }
}

三、代码过程总结:

  • 读取模板图像和测试图像。
  • 创建存储灰度模板和测试图像的变量 grayTempgrayTest
  • 将图像转换为灰度图像。
  • 对模板图像和测试图像进行二值化处理,将图像中的轮廓区域分割出来。
  • 定义存储轮廓结果和拓扑结构的变量 contourshierarchy
  • 使用 Cv2.FindContours 在模板图像中查找轮廓,存储在 contours 中,同时也获取轮廓的拓扑结构。
  • 遍历 contours 数组,找到满足条件的目标轮廓(这里是宽度和高度都大于80像素),在模板图像上绘制目标轮廓。
  • 使用 Cv2.ImShow 显示带有标记的模板图像。

到了这里,关于OpenCvSharp-轮廓形状匹配/模板查找1.0(附源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • opencv基础49-图像轮廓02-矩特征cv2.moments()->(形状分析、物体检测、图像识别、匹配)

    opencv基础49-图像轮廓02-矩特征cv2.moments()->(形状分析、物体检测、图像识别、匹配)

    矩特征(Moments Features)是用于图像分析和模式识别的一种特征表示方法,用来描述图像的形状、几何特征和统计信息。矩特征可以用于识别图像中的对象、检测形状以及进行图像分类等任务。 矩特征通过计算图像像素的高阶矩来提取特征。这些矩可以表示图像的中心、尺度

    2024年02月13日
    浏览(10)
  • Halcon基于形状的模板匹配

    Halcon基于形状的模板匹配

    基于形状的模板匹配,也称为基于边缘方向梯度的匹配,是一种最常用也最前沿的模板匹配算法。该算法以物体边缘的梯度相关性作为匹配标准,原理是提取ROI中的边缘特征,结合灰度信息创建模板,并根据模板的大小和清晰度的要求生成多层级的图像金字塔模型。接着在图

    2024年01月19日
    浏览(8)
  • c#-OpenCvSharp-棋盘格相机标定与图像矫正(源码demo)

    c#-OpenCvSharp-棋盘格相机标定与图像矫正(源码demo)

    目录 前言 核心函数: Cv2.FindChessboardCorners:检测角点 Cv2.DrawChessboardCorners:绘制角点 Cv2.CalibrateCamera:相机标定  结果: demo: 前言 相机标定是指确定相机内参和畸变参数的过程,而图像矫正则是对图像进行去畸变操作,以提高图像质量和准确性。 相机标定是的目标是确定相

    2024年04月11日
    浏览(11)
  • OpenCvSharp (C# OpenCV) 二维码畸变矫正--基于透视变换(附源码)

        本文主要介绍如何使用OpenCvSharp中的透视变换来实现二维码的畸变矫正。     由于CSDN文章中贴二维码会导致显示失败,大家可以直接点下面链接查看图片:     C# OpenCV实现二维码畸变矫正--基于透视变换 (详细步骤 + 代码)      讲解实现步骤之前先看下效果(左边是原图

    2024年02月15日
    浏览(18)
  • OpenCvSharp (C# OpenCV) 实现扫描文本矫正应用与实现详解(附源码)

    OpenCvSharp (C# OpenCV) 实现扫描文本矫正应用与实现详解(附源码)

    导  读     本文主要介绍使用OpenCV对扫描文本矫正的应用实例及详细实现步骤。 背景介绍     在使用打印机或扫描仪扫描文档时,由于摆放位置差异难免造成扫描文档的倾斜。本文将使用OpenCV将倾斜的文档矫正水平并去除黑边。   实现步骤     本文只针对包含大部分文

    2024年02月16日
    浏览(36)
  • 基于形状的模板匹配(Shape-Based)

    基于形状的模板匹配(Shape-Based)

    称为基于边缘方向梯度的匹配,是一种 最常用也是最前沿的模板匹配算法 以物体边缘的梯度相关性作为匹配标准 提取ROI中的边缘特征,结合灰度信息创建模板,并根据模板的大小和清晰度的要求生成多层级的图像金字塔模型 接着在图像金字塔层中自上而下逐层搜索模板图像

    2024年02月05日
    浏览(13)
  • C#图像处理-OpenCVSharp教程:OpenCVSharp与EmguCV的比较与介绍

    C#图像处理-OpenCVSharp教程:OpenCVSharp与EmguCV的比较与介绍 图像处理在计算机视觉和计算机图形学等领域发挥着至关重要的作用。本教程将介绍在C#中使用OpenCVSharp和EmguCV这两个流行的图像处理库,它们提供了丰富的功能和强大的性能。 一、OpenCVSharp介绍与特点 OpenCVSharp是OpenCV的

    2024年02月21日
    浏览(11)
  • C# OpenCvSharp 通道分离

    C# OpenCvSharp 通道分离

    目录 效果 项目 代码 下载  using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Extensions; namespace OpenCvSharp_通道分离 {     public partial class Form1 : Form     {    

    2024年02月09日
    浏览(10)
  • c# OpenCvSharp安装(一)

    c# OpenCvSharp安装(一)

    一  通过NuGet 安装四个拓展包 OpenCvSharp4、OpenCvSharp4.Extensions、OpenCvSharp4.runtime.win、OpenCvSharp4.WpfExtensions C#使用OpenCV的一些代码 需要加头文件 using OpenCvSharp;   //为了使用opencv using Point = OpenCvSharp.Point;   //为了确定我们使用的point是opencv的而不是draw的    c# OpenCV相关文章目录

    2024年04月16日
    浏览(8)
  • C# OpenCvSharp 图像校正

    C# OpenCvSharp 图像校正

    目录 效果 代码 下载 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Extensions; namespace OpenCvSharp_图像校正 {     public partial class Form1 : Form     {         pu

    2024年02月15日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包