C# OpenCvSharp 实现迷宫解密

举报
天天代码码天天 发表于 2024/12/05 14:46:18 2024/12/05
【摘要】 C# OpenCvSharp 实现迷宫解密

效果

项目

VS2022

.net framework 4.8

OpenCvSharp 4.8

代码

//读取图片
Mat src = Cv2.ImRead("test.png");

//BGR2GRAY
Mat gray = new Mat();
Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
//Cv2.ImShow("gray", gray);

//1、对图像进行二值化处理
//反转 产生一个二进制的图像与白色的墙壁和黑色的背景
Mat thresh = new Mat();
Cv2.Threshold(gray, thresh, 127, 255, ThresholdTypes.BinaryInv);
// Cv2.ImShow("thresh", thresh);

//2、对二值化后的图像进行轮廓检测并标注
OpenCvSharp.Point[][] contours;
HierarchyIndex[] hierarchly;
Cv2.FindContours(thresh, out contours, out hierarchly, RetrievalModes.External, ContourApproximationModes.ApproxNone);

Mat dc = Mat.Zeros(src.Size(), MatType.CV_8UC1);
Cv2.DrawContours(dc, contours, 0, new Scalar(255, 255, 255), 6);

//3、对图像阈值进行处理
Cv2.Threshold(dc, thresh, 240, 255, ThresholdTypes.Binary);
//Cv2.ImShow("thresh2", thresh);

//4、对图像进行扩展操作
/*
 扩张是数学形态领域的两个基本操作者之一,另一个是侵蚀。它通常应用于二进制图像,但有一些版本可用于灰度图像。
 操作者对二进制图像的基本效果是逐渐扩大前景像素区域的边界(通常为白色像素)。因此,前景像素的面积大小增加,而这些区域内的孔变小。
 */
Mat kernel = Mat.Ones(10, 10, MatType.CV_8UC1);
Mat dilation = new Mat();
Cv2.Dilate(thresh, dilation, kernel);
//Cv2.ImShow("dilation", dilation);

//5、对图像进行侵蚀操作
/*
 侵蚀是第二个形态运算符。它也适用于二进制图像。操作者对二进制图像的基本效果是消除前景像素区域的边界(通常为白色像素)。
 因此,前景像素的面积缩小,并且这些区域内的孔变大。
 */
Mat erosion = new Mat();
Cv2.Erode(dilation, erosion, kernel);
//Cv2.ImShow("erosion", erosion);

//6、分迷宫通道找出路径
Mat diff = new Mat();
Cv2.Absdiff(dilation, erosion, diff);

using OpenCvSharp;
using System;
using System.Drawing;
using System.Windows.Forms;

namespace OpenCvSharp_实现迷宫解密
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.Image = new Bitmap("test.png");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //读取图片
            Mat src = Cv2.ImRead("test.png");

            //BGR2GRAY
            Mat gray = new Mat();
            Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
            //Cv2.ImShow("gray", gray);

            //1、对图像进行二值化处理
            //反转 产生一个二进制的图像与白色的墙壁和黑色的背景
            Mat thresh = new Mat();
            Cv2.Threshold(gray, thresh, 127, 255, ThresholdTypes.BinaryInv);
            // Cv2.ImShow("thresh", thresh);

            //2、对二值化后的图像进行轮廓检测并标注
            OpenCvSharp.Point[][] contours;
            HierarchyIndex[] hierarchly;
            Cv2.FindContours(thresh, out contours, out hierarchly, RetrievalModes.External, ContourApproximationModes.ApproxNone);

            Mat dc = Mat.Zeros(src.Size(), MatType.CV_8UC1);
            Cv2.DrawContours(dc, contours, 0, new Scalar(255, 255, 255), 6);

            //3、对图像阈值进行处理
            Cv2.Threshold(dc, thresh, 240, 255, ThresholdTypes.Binary);
            //Cv2.ImShow("thresh2", thresh);

            //4、对图像进行扩展操作
            /*
             扩张是数学形态领域的两个基本操作者之一,另一个是侵蚀。它通常应用于二进制图像,但有一些版本可用于灰度图像。
             操作者对二进制图像的基本效果是逐渐扩大前景像素区域的边界(通常为白色像素)。因此,前景像素的面积大小增加,而这些区域内的孔变小。
             */
            Mat kernel = Mat.Ones(10, 10, MatType.CV_8UC1);
            Mat dilation = new Mat();
            Cv2.Dilate(thresh, dilation, kernel);
            //Cv2.ImShow("dilation", dilation);

            //5、对图像进行侵蚀操作
            /*
             侵蚀是第二个形态运算符。它也适用于二进制图像。操作者对二进制图像的基本效果是消除前景像素区域的边界(通常为白色像素)。
             因此,前景像素的面积缩小,并且这些区域内的孔变大。
             */
            Mat erosion = new Mat();
            Cv2.Erode(dilation, erosion, kernel);
            //Cv2.ImShow("erosion", erosion);

            //6、分迷宫通道找出路径
            Mat diff = new Mat();
            Cv2.Absdiff(dilation, erosion, diff);

            Mat[] channels = Cv2.Split(src);

            channels[0] &= ~diff;
            channels[1] &= ~diff;
            channels[2] |= diff;

            Mat dst = new Mat();
            Cv2.Merge(channels, dst);
            //Cv2.ImShow("solution", dst);

            pictureBox2.Image = new Bitmap(dst.ToMemoryStream());
        }
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。