• 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);

    1. using OpenCvSharp;
    2. using System;
    3. using System.Drawing;
    4. using System.Windows.Forms;
    5. namespace OpenCvSharp_实现迷宫解密
    6. {
    7. public partial class Form1 : Form
    8. {
    9. public Form1()
    10. {
    11. InitializeComponent();
    12. }
    13. private void Form1_Load(object sender, EventArgs e)
    14. {
    15. pictureBox1.Image = new Bitmap("test.png");
    16. }
    17. private void button1_Click(object sender, EventArgs e)
    18. {
    19. //读取图片
    20. Mat src = Cv2.ImRead("test.png");
    21. //BGR2GRAY
    22. Mat gray = new Mat();
    23. Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
    24. //Cv2.ImShow("gray", gray);
    25. //1、对图像进行二值化处理
    26. //反转 产生一个二进制的图像与白色的墙壁和黑色的背景
    27. Mat thresh = new Mat();
    28. Cv2.Threshold(gray, thresh, 127, 255, ThresholdTypes.BinaryInv);
    29. // Cv2.ImShow("thresh", thresh);
    30. //2、对二值化后的图像进行轮廓检测并标注
    31. OpenCvSharp.Point[][] contours;
    32. HierarchyIndex[] hierarchly;
    33. Cv2.FindContours(thresh, out contours, out hierarchly, RetrievalModes.External, ContourApproximationModes.ApproxNone);
    34. Mat dc = Mat.Zeros(src.Size(), MatType.CV_8UC1);
    35. Cv2.DrawContours(dc, contours, 0, new Scalar(255, 255, 255), 6);
    36. //3、对图像阈值进行处理
    37. Cv2.Threshold(dc, thresh, 240, 255, ThresholdTypes.Binary);
    38. //Cv2.ImShow("thresh2", thresh);
    39. //4、对图像进行扩展操作
    40. /*
    41. 扩张是数学形态领域的两个基本操作者之一,另一个是侵蚀。它通常应用于二进制图像,但有一些版本可用于灰度图像。
    42. 操作者对二进制图像的基本效果是逐渐扩大前景像素区域的边界(通常为白色像素)。因此,前景像素的面积大小增加,而这些区域内的孔变小。
    43. */
    44. Mat kernel = Mat.Ones(10, 10, MatType.CV_8UC1);
    45. Mat dilation = new Mat();
    46. Cv2.Dilate(thresh, dilation, kernel);
    47. //Cv2.ImShow("dilation", dilation);
    48. //5、对图像进行侵蚀操作
    49. /*
    50. 侵蚀是第二个形态运算符。它也适用于二进制图像。操作者对二进制图像的基本效果是消除前景像素区域的边界(通常为白色像素)。
    51. 因此,前景像素的面积缩小,并且这些区域内的孔变大。
    52. */
    53. Mat erosion = new Mat();
    54. Cv2.Erode(dilation, erosion, kernel);
    55. //Cv2.ImShow("erosion", erosion);
    56. //6、分迷宫通道找出路径
    57. Mat diff = new Mat();
    58. Cv2.Absdiff(dilation, erosion, diff);
    59. Mat[] channels = Cv2.Split(src);
    60. channels[0] &= ~diff;
    61. channels[1] &= ~diff;
    62. channels[2] |= diff;
    63. Mat dst = new Mat();
    64. Cv2.Merge(channels, dst);
    65. //Cv2.ImShow("solution", dst);
    66. pictureBox2.Image = new Bitmap(dst.ToMemoryStream());
    67. }
    68. }
    69. }

    下载 

    Demo下载

  • 相关阅读:
    quill富文本编辑器——修改默认图片、视频上传功能
    《系统架构设计师教程(第2版)》第5章-软件工程基础知识-05-净室软件工程(CSE)
    Opencv图像缩放和平移
    分布式、锁、延时任务
    深度学习中的激活函数有哪些?
    线性表的链式表示和实现
    一文带你理解【自然语言处理(NLP)】的基本概念及应用
    被百度判定为低质量网站了!如何整改?
    【java+vue】前后端项目架构详细流程
    XSS 跨站点脚本漏洞详解
  • 原文地址:https://blog.csdn.net/lw112190/article/details/133638094