OpenCvSharp实现Mat对象简单的像素操作

 更新时间:2020年11月17日 10:59:36   作者:haixin-561  
这篇文章主要介绍了OpenCvSharp实现Mat对象简单的像素操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1: 输出一个Mat对象的像素

自定义一个Mat 对象,然后输出像素值(像素值基本都在 0 – 255 之间 ,图像为三通道)
代码

public static void F1()
    {
      Scalar s = new Scalar(0, 0, 255); //定义一个三通道颜色(红色)
      Mat m = new Mat(100, 100, MatType.CV_8UC3, s); //矩阵数据类型(深度和通道数) MatType


      /*
       * 小图像的每一个像素值我们都是知道的,可以输出查看,验证算法正确性,然后在ran大图
       */
      //打印 100 * 100 Mat对象像素值
      for (int i = 0; i < m.Height; i++)
      {
        for (int j = 0; j < m.Width; j++)
        {
          Vec3b color = m.Get<Vec3b>(i, j); //new Vec3b(); 颜色通道类型 (字节的三元组),直接视同Get泛型方法返回指定类型

          //单独获取指定通道像素
          //color.Item0= m.Get<Vec3b>(i, j).Item0; //R
          //color.Item1 = m.Get<Vec3b>(i, j).Item1; //G
          //color.Item2 = m.Get<Vec3b>(i, j).Item2; //B

          Console.Write(color.Item0 + " " + color.Item1 + " " + color.Item2);
          Console.WriteLine(" "); //输出一个换行
        }
        
      }

      using (new Window("M", WindowMode.AutoSize, m))
      {
        Cv2.WaitKey(0);
      }

    }

在这里插入图片描述

100*100 个像素大小的图像不是很大,颜色在代码值指定了(0,0,255)三通道的颜色值,打印出来都只是(0,0,255)。
下面读取一张彩色图片试一下:

 public static void F1(string path)
    {
      //Scalar s = new Scalar(0, 0, 255);
      //Mat m = new Mat(100, 100, MatType.CV_8UC3, s); //矩阵数据类型(深度和通道数) MatType
      Mat m = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth);

      /*
       * 小图像的每一个像素值我们都是知道的,可以输出查看,验证算法正确性,然后在ran大图
       */
      //打印 100 * 100 Mat对象像素值
      for (int i = 0; i < m.Height; i++)
      {
        for (int j = 0; j < m.Width; j++)
        {
          Vec3b color = m.Get<Vec3b>(i, j); //new Vec3b(); 颜色通道类型(字节的三元组) ,直接视同Get泛型方法返回指定类型

          //单独获取指定通道像素
          //color.Item0= m.Get<Vec3b>(i, j).Item0; //R
          //color.Item1 = m.Get<Vec3b>(i, j).Item1; //G
          //color.Item2 = m.Get<Vec3b>(i, j).Item2; //B

          Console.Write(color.Item0 + " " + color.Item1 + " " + color.Item2);
          Console.WriteLine(" "); //输出一个换行
        }
        
      }
      Console.WriteLine("图像高度:{0}", m.Height);
      Console.WriteLine("图像宽度:{0}", m.Width);
      using (new Window("M", WindowMode.AutoSize, m))
      {
        Cv2.WaitKey(0);
      }

    }

在这里插入图片描述

这张图比较大,输出像素要费点时间,最后输出了图像的高度和宽度 480 * 512 =245760 多个像素点。 像素点的值 都在0 --255之间且是正数。

2:使用指针获取一个像素值和图像的行列值

代码 在C#中使用指针方法要加 unsafe , Main函数也要加

unsafe static void Main(string[] args)
    {
      string imagePath = @"E:\image\lenna.png"; //图片加载路径
      
      Function1(imagePath);
    }
/// <summary>
    /// 操作指针要加 unsafe
    /// </summary>
    unsafe public static void Function1(string path)
    {
      Mat src = new Mat(path, ImreadModes.AnyColor);
      if (src.Empty()) //判断 MAT对象是否为空,不过在C#中好像没用,因为在mat对象初始化的时候找不到图片就直接抛出异常了,但是C++中可以用来判断。
      {
        Console.WriteLine("加载图像出错");
        return;
      }


      /*
       C++:
       Mat dst;
       dst=Mat(src.Size(), src.Type());
       dst=Scalar(127,0,255);
       */
      //Scalar s = new Scalar(127, 0, 255); //创建一个颜色标量(RED)C# 中是一个对象
      // Mat dst = new Mat(src.Size(), src.Type(),s);//创建一个与src 的大小和类型一直的图片矩阵

      //Mat dst = src.Clone(); //克隆:得到一个完全拷贝的对象

      Mat dst = new Mat();
      src.CopyTo(dst); //拷贝一个与克隆类似,但是dst必须先new出来

      //Cv2.CvtColor(src, dst, ColorConversionCodes.BGRA2GRAY); //转为灰度图
      Console.WriteLine("InputImage 颜色通道:{0}", src.Channels()); //颜色通道数
      Console.WriteLine("Create 颜色通道:{0}", dst.Channels()); //颜色通道数

      //指针获取值(根据下标),第一个像素值
      IntPtr c = dst.Ptr(0); //Mat对象的 Ptr方法:返回指向指定矩阵行的指针。
      byte* c1 = (byte*)c; //像素值在C#中是byte类型 ,在C++中是 uchar类型
      //byte* cc = (byte*)dst.Ptr(0);
      Console.WriteLine("第一个像素值:{0}", *c1);

      int row = dst.Rows; //行
      int clo = dst.Cols; //列
      Console.WriteLine("Rows :{0} ;Cols :{1}", row, clo);
      using (new Window("Create", WindowMode.FreeRatio, dst))
      using (new Window("InputImage", WindowMode.FreeRatio, src))
      {
        Cv2.WaitKey(0);
      }
    }

在这里插入图片描述

到此这篇关于OpenCvSharp实现Mat对象简单的像素操作的文章就介绍到这了,更多相关OpenCvSharp Mat对象像素操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#调用WebService实例与开发教程(推荐)

    C#调用WebService实例与开发教程(推荐)

    下面小编就为大家分享一篇C#调用WebService实例与开发教程,具有很好的参考价值,希望对大家有所帮助。一起跟随想过来看看吧
    2017-12-12
  • Unity UGUI实现滑动翻页直接跳转页数

    Unity UGUI实现滑动翻页直接跳转页数

    这篇文章主要为大家详细介绍了Unity UGUI实现滑动翻页,直接跳转页数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • WPF ProgressBar实现实时进度效果

    WPF ProgressBar实现实时进度效果

    这篇文章主要介绍了WPF ProgressBar实现实时进度效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • C#使用ADO.Net部件来访问Access数据库的方法

    C#使用ADO.Net部件来访问Access数据库的方法

    数据库的访问是所有编程语言中最重要的部分,C#提供了ADO.Net部件用于对数据库进行访问。本文从最简单易用的微软Access数据库入手讨论在C#中对数据库的访问。
    2015-09-09
  • WPF中使用CallerMemberName简化InotifyPropertyChanged的实现

    WPF中使用CallerMemberName简化InotifyPropertyChanged的实现

    这篇文章介绍了WPF中使用CallerMemberName简化InotifyPropertyChanged的实现,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Unity游戏之存储数据

    Unity游戏之存储数据

    这篇文章主要介绍了Unity游戏之存储数据,感兴趣的同学,可以拷贝代码,试验一下
    2021-04-04
  • c#给图片添加文字的代码小结

    c#给图片添加文字的代码小结

    c#编程中,我们需要为图片添加文字水印,那么就可以参考下面的几个代码
    2012-11-11
  • C#引用访问权限分析

    C#引用访问权限分析

    这篇文章主要介绍了C#引用访问权限问题,对比C#与Java实例分析了C#在引入引用访问权限特性之后的具体用法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • C# 如何使用批处理启动Windows服务

    C# 如何使用批处理启动Windows服务

    这篇文章主要介绍了C#使用批处理启动Windows服务,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • C# Chart 简单使用教程

    C# Chart 简单使用教程

    Chart控件可以用来绘制波形图、柱状图、饼图、折线图等,用来进行数据表现是很不错的,现在简单说一下这个控件的使用方法,对C# Chart使用相关知识感兴趣的朋友一起看看吧
    2022-11-11

最新评论