本文使用示例讲解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

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, (图片不大, 运行时内存过大)


结语:
更过的学习可参考官网的wiki: https://github.com/shimat/opencvsharp/wiki
后续如果有时间的话继续更新此系列
作者:wwmin
本文链接:https://www.jianshu.com/p/21a6883ca77e
转载请注明出处!
微信公众号: DotNet技术说
如果您觉得文章对您有帮助,关注点赞,您的鼓励是博主的最大动力!
网友评论