• C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]


    C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]

    • 矩阵创建
    • 图像显示与保存
    • 像素读取与赋值
    • 新建sample02项目,配置opencv4相关包,新建.cs进行测试

    1.矩阵创建

    //创建空白矩阵
    var dst = new Mat()
    
    //创建并赋值
    var src = new Mat(new Size(128, 128), MatType.CV_8U, Scalar.All(125))//图像拷贝
    Mat dst = src.Clone();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    图像显示与保存

    private static void test_0()
    {
         //全黑
         var mat = new Mat(new Size(600, 600), MatType.CV_8UC3, new Scalar(0, 0, 0));
         Cv2.NamedWindow("black", 0);
         Cv2.ImShow("black", mat);
    
         // 全白
         mat = new Mat(new Size(600, 600), MatType.CV_8UC3, new Scalar(255, 255, 255));
         Cv2.NamedWindow("white", 0);
         Cv2.ImShow("white", mat);
         Cv2.ImWrite("white.jpg", mat);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    像素读取与赋值

    • 两种常用的图像遍历方式
            private void GetSet()
            {
                using var mat = new Mat(ImagePath.Lenna, ImreadModes.Color);
                for (int y = 0; y < mat.Height; y++)
                {
                    for (int x = 0; x < mat.Width; x++)
                    {
                        Vec3b color = mat.Get<Vec3b>(y, x);
                        Vec3b newColor = new Vec3b(color.Item2, color.Item1, color.Item0);
                        mat.Set<Vec3b>(y, x, newColor);
                    }
                }
                Cv2.ImShow("Slow", mat);
                Cv2.WaitKey(0);
                Cv2.DestroyAllWindows();
            }
    
            /// 
            /// Reasonably fast
            /// 
            private void GenericIndexer()
            {
                using var mat = new Mat(ImagePath.Lenna, ImreadModes.Color);
                var indexer = mat.GetGenericIndexer<Vec3b>();
                for (int y = 0; y < mat.Height; y++)
                {
                    for (int x = 0; x < mat.Width; x++)
                    {
                        Vec3b color = indexer[y, x];
                        Vec3b newColor = new Vec3b(color.Item2, color.Item1, color.Item0);
                        indexer[y, x] = newColor;
                    }
                }
                Cv2.ImShow("GenericIndexer", mat);
                Cv2.WaitKey(0);
                Cv2.DestroyAllWindows();
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 灰度图操作
     private static void test_1()
     {
          var img = new Mat(new Size(128, 128), MatType.CV_8U, 1);
          var pixel = img.GetGenericIndexer<int>();
          for (var y = 0; y < img.Height; y++)
          {
                for (var x = 0; x < img.Width; x++)
                {
                     pixel[y, x] = x + y;
                }
           }
    
           Cv2.NamedWindow("单通道",0);
           Cv2.ImShow("单通道", img);
           Cv2.WaitKey(0);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    • 三通道图操作
    private static void test_2()
    {
         //三通道
         using (var src = new Mat(new Size(128, 128), MatType.CV_8UC3, new Scalar(20, 129, 250)))
         using (var dst = new Mat())
         {
    
              for (var y = 0; y < src.Height; y++)
              {
                   for (var x = 0; x < src.Width; x++)
                   {
                        var color = src.Get<Vec3b>(y, x);
                        var temp = color.Item0;
                        color.Item0 = color.Item2; // B <- R
                        color.Item2 = temp;        // R <- B
                        src.Set(y, x, color);
                   }
               }
    
               src.CopyTo(dst);
               Mat dat = dst.Clone();
    
               Cv2.NamedWindow("dst", 0);
               Cv2.ImShow("dst", dst);
               Cv2.WaitKey(0);
          }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

    • 完整代码
    using OpenCvSharp;
    
    namespace OpenCVSharpSample01
    {
        class Program
        {
            static void Main(string[] args)
            {
                test_0();
    
                test_1();
    
                test_2();
    
            }
    
            private static void test_0()
            {
                var mat = new Mat(new Size(600, 600), MatType.CV_8UC3, new Scalar(0, 0, 0));
                Cv2.NamedWindow("black", 0);
                Cv2.ImShow("black", mat);
    
                // 全白
                mat = new Mat(new Size(600, 600), MatType.CV_8UC3, new Scalar(255, 255, 255));
                Cv2.NamedWindow("white", 0);
                Cv2.ImShow("white", mat);
                Cv2.ImWrite("white.jpg", mat);
            }
            private static void test_1()
            {
                var img = new Mat(new Size(128, 128), MatType.CV_8U, 1);
                var pixel = img.GetGenericIndexer<int>();
                for (var y = 0; y < img.Height; y++)
                {
                    for (var x = 0; x < img.Width; x++)
                    {
                        pixel[y, x] = x + y;
                    }
                }
    
                Cv2.NamedWindow("单通道",0);
                Cv2.ImShow("单通道", img);
                Cv2.WaitKey(0);
            }
            private static void test_2()
            {
                //三通道
                using (var src = new Mat(new Size(128, 128), MatType.CV_8U, Scalar.All(125)))
                using (var dst = new Mat())
                {
    
                    for (var y = 0; y < src.Height; y++)
                    {
                        for (var x = 0; x < src.Width; x++)
                        {
                            var color = src.Get<Vec3b>(y, x);
                            var temp = color.Item0;
                            color.Item0 = color.Item2; // B <- R
                            color.Item2 = temp;        // R <- B
                            src.Set(y, x, color);
                        }
                    }
    
                    src.CopyTo(dst);
                    Mat dat = dst.Clone();
    
                    Cv2.NamedWindow("dst", 0);
                    Cv2.ImShow("dst", dst);
                    Cv2.WaitKey(0);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
  • 相关阅读:
    LV.12 D18 中断处理 学习笔记
    UnityShader 全局传值无效
    python作业1
    NIO‘s Sword(思维,取模,推公式)
    为paddle的multi-gpu安装NCCL
    Java泛型详解
    LeetCode 周赛 341 场,模拟 / 树上差分 / Tarjan 离线 LCA / DFS
    SpringBoot项目常用注解
    Frida安装到使用一目了然
    Java Socket实现简易多人聊天室传输聊天内容或文件
  • 原文地址:https://blog.csdn.net/yohnyang/article/details/134541339