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对象像素操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#中OpenCvSharp 通过特征点匹配图片的方法

    现在的手游基本都是重复操作,一个动作要等好久,结束之后继续另一个动作.很麻烦,所以动起了自己写一个游戏辅助的心思. 这个辅助本身没什么难度,就是通过不断的截图,然后从这个截图中找出预先截好的能代表相应动作的按钮或者触发条件的小图. 找到之后获取该子区域的左上角坐标,然后通过windows API调用鼠标或者键盘做操作就行了. 这里面最难的也就是找图了,因为要精准找图,而且最好能适应不同的分辨率下找图,所以在模板匹配的基础上,就有了SIFT和SURF的特征点找图方式. 在写的过程中查找资料,大都是

  • 在C#中使用OpenCV(使用OpenCVSharp)的实现

     1.什么是OpenCVSharp 为了解决在Csharp下编写OpenCV程序的问题,我做过比较深入的研究,并且实现了高效可用的方法(GOCW):这几天在搜集资料的时候,偶尔看见了OpenCVSharp,从时间上来看,它已经经过了更久的发展,应该有许多直接借鉴.或者直接使用的地方. OpenCVSharp有一名日本工程师开发,项目地址为:https://github.com/shimat/opencvsharp.其是OpenCV的.NET wrapper,它比Emgucv更接近于原始的Open

  • OpenCvSharp图像的修改和保存以及掩膜操作

    一 :图像的颜色空间转换 在OpenCvSharp中颜色转换函数为:Cv2.CvtColor() 参数: 参数 说明 src: 源图像,8位无符号,16位无符号或单精度浮点 dst: 输出图像,具有与src相同的大小和深度 code: 颜色空间转换代码:(ColorConversionCodes)枚举类型 代码: static void Main(string[] args) { Mat src = new Mat(@"C:\Users\whx\Desktop\opcvImage\s1.jpg

  • C#中OpenCVSharp实现轮廓检测

    OpenCv提供了函数 findContours()用于对物体轮廓进行检测,该函数实现算法是由S.suzuki K.Abe于1985年发表的.OpenCVSharp封装了这个函数,有2个参数(contours,hierarchy)要做特别的说明. public static void FindContours(InputOutputArray image, out Point[][] contours, out HierarchyIndex[] hierarchy, RetrievalModes

  • 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 /* * 小图像的每一个像素值我们都是知道的,可以输出查看,验证算法正

  • JS window对象简单操作完整示例

    本文实例讲述了JS window对象简单操作.分享给大家供大家参考,具体如下: 例1: <html> <head> <title>js---window函数</title> <meta charset="UTF-8"/> <script type="text/javascript"> // 显示框:没有返回值,出现一个提示框 var sto; var stl; function testAler

  • java之File对象对文件的操作常用的几个方法(推荐)

    File对象是对文件操作最常用的类,平常工作总用的很多,贴出来了几个我工作常用的几个方法.简单总结了下 直接上代码: //构建文件对象 File file=new File("E:/android_demo/a"); File fileTest=new File("E:/android_demo/a/test.mp3"); //获取文件的父路径 File f=file.getParentFile(); System.out.println("f==&quo

  • 基于Python实现一个简单的银行转账操作

    前言 在进行一个应用系统的开发过程中,从上到下一般需要四个构件:客户端-业务逻辑层-数据访问层-数据库,其中数据访问层是一个底层.核心的技术.而且在实际开发中,数据库的操作也就是说数据访问层都是嵌套在其他语言中的,其是编程的核心.本文面向的是python语言,即通过python操作数据库来实现简单的银行转账操作. 工具 python提供了python DB API用来统一操作数据库,使访问数据库的接口规范化,在没有python DB API之前,接口程序十分混乱,不同的数据库需要不同的操作接口,

  • C#中简单的装箱操作实例分析

    本文实例讲述了C#中简单的装箱操作.分享给大家供大家参考.具体如下: C#中装箱是:容许将值类型作为引用类型(比如:对象)进行处理的过程. 下面的代码非常简单,可将一个整数转换成Object using System; class ConversionSample { static void Main() { int num1 = 123; Object obj = num1; Console.WriteLine(num1.ToString()); Console.WriteLine(obj.T

  • PHP+Ajax简单get验证操作示例

    本文实例讲述了PHP+Ajax简单get验证操作.分享给大家供大家参考,具体如下: 1.显示页面代码 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>XMLHttpRequest独对象使用实例</title> <script language="JavaScript&

  • Python简单I/O操作示例

    本文实例讲述了Python简单I/O操作.分享给大家供大家参考,具体如下: 文件: poem = ''' hello world ''' f = file('book.txt', 'w') #以write模式打开文件,用于写.(写入的文件编码为UTF-8) f.write(poem) f.close() f = file('book.txt') #默认以read模式打开文件 while True: line = f.readline() #读取一行,包括行末的换行符 if len(line) =

  • JavaScript实现的简单加密解密操作示例

    本文实例讲述了JavaScript实现的简单加密解密操作.分享给大家供大家参考,具体如下: JavaScript实现对内容的加密和解密.加密,转成编码.解密则是编码转字符串. <html> <head> <meta charset="utf-8" /> <title>www.jb51.net JS加密解密</title> </head> <body> <h1> 加密解密 </h1>

  • JavaScript对象拷贝与赋值操作实例分析

    本文实例讲述了JavaScript对象拷贝与赋值操作.分享给大家供大家参考,具体如下: 今天在做公司面试题的时候,遇到了一道关于JavaScript之对象拷贝与赋值的问题,突然觉得很有意义,想和大家一起来分享一下! 首先,先摆出代码,如下: /** * Created by Administrator on 2016/12/7. */ var obj={ name:"dahuang", age:10 } var newObj=obj; newObj.name="xiaohua

  • opencv3/C++图像像素操作详解

    RGB图像转灰度图 RGB图像转换为灰度图时通常使用: 进行转换,以下尝试通过其他对图像像素操作的方式将RGB图像转换为灰度图像. #include<opencv2/opencv.hpp> #include<math.h> using namespace cv; int main() { //像素操作 Mat src,dst; src = imread("E:/image/image/daibola.jpg"); if(src.empty()) { printf

随机推荐