美文网首页
Opencvsharp 入门 之 图像处理

Opencvsharp 入门 之 图像处理

作者: wwmin_ | 来源:发表于2022-07-26 10:49 被阅读0次

本文使用示例讲解opencvsharp的入门用法

前言

引用百度百科的原文:OpenCvSharp [1] 是一个OpenCV的.Net wrapper,应用最新的OpenCV库开发,使用习惯比EmguCV更接近原始的OpenCV,有详细的使用样例供参考。该库采用LGPL发行,对商业应用友好。使用OpenCvSharp,可用C#,VB.NET等语言实现多种流行的图像处理(image processing)与计算机视觉(computer vision)算法。

opencvsharp 官网 github: https://github.com/shimat/opencvsharp

opencvsharp

1. 安装:

在win平台上的console中安装以下依赖
//OpenCvSharp4
//OpenCvSharp4.Extensions
//OpenCvSharp4.runtime.win

2. 图片基本操作

using OpenCvSharp;

using System.Drawing;

test1();
test2();


void test1()
{
  Mat _mat = new Mat("11.jpg");
  Cv2.ImShow("sss", _mat);


  Cv2.WaitKey();

  var mat3 = new Mat<Vec3b>(_mat);
  var indexer = mat3.GetIndexer();
  // 像素翻转
  for (int y = 0; y < _mat.Height; y++)
  {
    for (int x = 0; x < _mat.Width; x++)
    {
      Vec3b color = indexer[y, x];
      byte temp = color.Item0;
      color.Item0 = color.Item2; // b<-r
      color.Item2 = temp;//r<-b
      indexer[y, x] = color;
    }
  }

  Cv2.ImShow("mat3", mat3);

  Cv2.WaitKey();

  //OpenCvSharp4
  //OpenCvSharp4.Extensions
  //OpenCvSharp4.runtime.win

  // 将Mat转为Bitmap
  Bitmap _bitmap = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(_mat);
  // 将Bitmap保存为jpg
  _bitmap.Save("./test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);


}

void test2()
{
  {
    Mat mat = new Mat("11.jpg");
    // 将mat转byte[]
    // 方法1:
    byte[] bytes = mat.ToBytes(".png");

    // 方法2:
    byte[] bytes2;
    Cv2.ImEncode(".jpg", mat, out bytes2);
  }

  {
    byte[] imageData = System.IO.File.ReadAllBytes("11.jpg");
    // 将byte[]转mat
    Mat colorMat = Mat.FromImageData(imageData, ImreadModes.Color);
    Cv2.ImShow("colorMat", colorMat);
  }
  Cv2.WaitKey();
}

3. 创建透明图

  // 创建一个颜色对象
  Scalar s = new Scalar(0, 0, 255, 50);
  /**
  * 参数:
  *      1: 行 --指定图像的像素行数,多个行组成图片的高度
  *      2: 列 --指定图像的像素列数,多个列组成图片的宽度
  *      3: 对象类型,结构体类型 矩阵数据类型(深度和通道数) MatType
  *      4: 图像颜色
*/
  // 在OpenCvSharp里面,图像一般使用Mat对象存储。Mat即矩阵,矩阵的每一项是一个MatType结构。
  //MatType有CV_16SC4、CV_8UC3、CV_8UC1等,可以看到,类型皆由四部分组成,定义如下:
  // 8             U                  C                   3
  // 每通道的字节数    每通道的数据类型    固定为C,指Channel   通道数
  // 一般的无透明彩色图,每一格像素包含了RGB三个通道,所以其类型为8UC3,如果还包含透明度信息,则选用8UC4类型。
  Mat mat = new Mat(400, 400, MatType.CV_8UC4, s);
  var mat4 = new Mat<Vec4b>(mat);
  var indexer = mat4.GetIndexer();

  for (int y = 0; y < mat.Height / 2; y++)
  {
    for (int x = 0; x < mat.Width / 2; x++)
    {
      // 注意: 此时颜色顺序为 [B,G,R]
      Vec4b color = indexer[y, x];
      color.Item0 = 255;
      color.Item1 = 255;
      color.Item2 = 0;
      color.Item3 = 255;// 通道0表示完全透明,255表示完全不透明
      indexer[y, x] = color;
    }
  }

  // 注意: 使用ImShow方法没有显示出Alpha透明通道效果,可以保存到png图片后查看
  Cv2.ImShow("test", mat4);
  // 将mat保存成图片
  mat4.ImWrite("22.png");
  Cv2.WaitKey();

再次提醒: 使用ImShow方法没有显示出Alpha透明通道效果,可以保存到png图片后查看

测试图像大小:
100000x100000 MatType.CV_8UC4
运行内存会打满, (我的台式机是64G内存,内存直接被打满:!), 运行时间超过1分钟, 生成的图片大小为37M, (图片不大, 运行时内存过大)

Cv2.ImShow效果
保存成png图片后效果

结语:
更过的学习可参考官网的wiki: https://github.com/shimat/opencvsharp/wiki
后续如果有时间的话继续更新此系列

作者:wwmin
本文链接:https://www.jianshu.com/p/21a6883ca77e
转载请注明出处!
微信公众号: DotNet技术说
如果您觉得文章对您有帮助,关注点赞,您的鼓励是博主的最大动力!

相关文章

网友评论

      本文标题:Opencvsharp 入门 之 图像处理

      本文链接:https://www.haomeiwen.com/subject/zufoirtx.html