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

{

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

Mat srcImage = Cv2.ImRead("test.jpg");

Mat dstImage = ToolsFindContours(srcImage);

Bitmap Bitmap1 = BitmapConverter.ToBitmap(srcImage);

Bitmap Bitmap2 = BitmapConverter.ToBitmap(dstImage);

pictureBox1.Image = Bitmap1;

pictureBox2.Image = Bitmap2;

}

/// <summary>

/// 查找轮廓

/// </summary>

/// <param name="srcImage"></param>

/// <returns></returns>

public static Mat ToolsFindContours(Mat srcImage)

{

// 转化为灰度图

Mat src_gray = new Mat();

Cv2.CvtColor(srcImage, src_gray, ColorConversionCodes.RGB2GRAY);

// 滤波

Cv2.Blur(src_gray, src_gray, new OpenCvSharp.Size(3, 3));

// Canny边缘检测

Mat canny_Image = new Mat();

// 输入、输出、最小阀值、最大阀值

Cv2.Canny(src_gray, canny_Image, 100, 200);

// 获得轮廓

OpenCvSharp.Point\[\]\[\] contours;

HierarchyIndex\[\] hierarchly;

/*

1.寻找轮廓的图像

2.返回轮廓数组

3.层次结构索引

4.轮廓的检索模式(External只检测外轮廓,List检测所有轮廓,CComp检测所有轮廓并建立两个等级,Tree检测所有轮廓并建立等级树

5.轮廓近似模式(ApproxNone保存物体边界上所有连续的轮廓点, ApproxSimple仅保存轮廓的拐点信息。CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用Teh-Chin chain 近似算法)

6.Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量

*/

Cv2.FindContours(canny_Image, out contours, out hierarchly, RetrievalModes.Tree, ContourApproximationModes.ApproxNone, new OpenCvSharp.Point(0, 0));

// 将结果画出并返回结果

Mat dst_Image = Mat.Zeros(canny_Image.Size(), srcImage.Type());

for (int i = 0; i < contours.Length; i++)

{

// 轮廓的颜色为绿色

Scalar color = new Scalar(0, 255, 0);

/*

1.输入图

2.表示输入的轮廓组

3.指明画第几个轮廓

4.颜色

5.thickness为轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内部

6.线形

7.轮廓结构信息

*/

Cv2.DrawContours(dst_Image, contours, i, color, 2, LineTypes.Link8, hierarchly);

}

return dst_Image;

}

}

}

cs 复制代码
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
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Mat srcImage = Cv2.ImRead("test.jpg");
            Mat dstImage = ToolsFindContours(srcImage);

            Bitmap Bitmap1 = BitmapConverter.ToBitmap(srcImage);
            Bitmap Bitmap2 = BitmapConverter.ToBitmap(dstImage);

            pictureBox1.Image = Bitmap1;
            pictureBox2.Image = Bitmap2;
        }


        /// <summary>
        /// 查找轮廓
        /// </summary>
        /// <param name="srcImage"></param>
        /// <returns></returns>
        public static Mat ToolsFindContours(Mat srcImage)
        {
            // 转化为灰度图
            Mat src_gray = new Mat();
            Cv2.CvtColor(srcImage, src_gray, ColorConversionCodes.RGB2GRAY);
            // 滤波
            Cv2.Blur(src_gray, src_gray, new OpenCvSharp.Size(3, 3));
            // Canny边缘检测
            Mat canny_Image = new Mat();
            // 输入、输出、最小阀值、最大阀值
            Cv2.Canny(src_gray, canny_Image, 100, 200);
            // 获得轮廓
            OpenCvSharp.Point[][] contours;
            HierarchyIndex[] hierarchly;
            /*
            1.寻找轮廓的图像
            2.返回轮廓数组
            3.层次结构索引
            4.轮廓的检索模式(External只检测外轮廓,List检测所有轮廓,CComp检测所有轮廓并建立两个等级,Tree检测所有轮廓并建立等级树
            5.轮廓近似模式(ApproxNone保存物体边界上所有连续的轮廓点, ApproxSimple仅保存轮廓的拐点信息。CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用Teh-Chin chain 近似算法)
            6.Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量
            */
            Cv2.FindContours(canny_Image, out contours, out hierarchly, RetrievalModes.Tree, ContourApproximationModes.ApproxNone, new OpenCvSharp.Point(0, 0));
            // 将结果画出并返回结果
            Mat dst_Image = Mat.Zeros(canny_Image.Size(), srcImage.Type());
            for (int i = 0; i < contours.Length; i++)
            {
                // 轮廓的颜色为绿色
                Scalar color = new Scalar(0, 255, 0);
                /*
                1.输入图
                2.表示输入的轮廓组
                3.指明画第几个轮廓
                4.颜色
                5.thickness为轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内部
                6.线形
                7.轮廓结构信息
                */
                Cv2.DrawContours(dst_Image, contours, i, color, 2, LineTypes.Link8, hierarchly);
            }
            return dst_Image;
        }
    }
}

下载

Demo下载

相关推荐
无限的鲜花2 小时前
反射(原创推荐)
java·开发语言
yongche_shi3 小时前
ragas官方文档中文版(五十)
开发语言·python·ai·ragas·如何评估和改进 rag 应用
一路向北he3 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
AI行业学习4 小时前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
大圣编程5 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
upgrador5 小时前
基础知识:C++ STL构造函数的左闭右开惯例及其实现原理
开发语言·c++
yoothey6 小时前
报废审批流规则引擎设计——责任链模式完整实现
linux·开发语言·bash
geovindu6 小时前
python: Functional Options Pattern
开发语言·后端·python·设计模式·惯用法模式·函数式选项模式
wuyk5557 小时前
24. C 语言模块化:不是拆几个.c 文件那么简单
c语言·开发语言·stm32·单片机
北域码匠7 小时前
嵌入式限幅滤波:工业信号降噪利器
c#·传感器采集·数据预处理·嵌入式算法·限幅滤波·数字滤波·数据降噪