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

这篇具有很好参考价值的文章主要介绍了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();

c# 图像mat 赋值,# C# - Opencv,opencv,计算机视觉,人工智能,C#,目标检测

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

c# 图像mat 赋值,# C# - Opencv,opencv,计算机视觉,人工智能,C#,目标检测

3.像素读取与赋值

  • 两种常用的图像遍历方式
        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();
        }

        /// <summary>
        /// Reasonably fast
        /// </summary>
        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();
        }
  • 灰度图操作
 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);
}

c# 图像mat 赋值,# C# - Opencv,opencv,计算机视觉,人工智能,C#,目标检测

  • 三通道图操作
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);
      }
}

c# 图像mat 赋值,# C# - Opencv,opencv,计算机视觉,人工智能,C#,目标检测文章来源地址https://www.toymoban.com/news/detail-776564.html

  • 完整代码
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);
            }
        }
    }
}

到了这里,关于C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包