using (Mat zx61 = new Mat("./data/test.jpg", ImreadModes.AnyColor)) {
//上一行代码可以用 Mat zx61 =Cv2.ImRead("./data/test.jpg", ImreadModes.AnyColor); 代替
using (new Window("zx61", WindowMode.AutoSize, zx61)) //新建一个窗口显示图片
{
Cv2.WaitKey(); //等待用户按键
}
}
加载模式,常用的有:全色彩和灰阶图..框框所示
三/自定义一张图片
Scalar s = new Scalar(0, 0, 255);//创建一个颜色对象
using (Mat zx6161 = new Mat(100, 100, MatType.CV_32FC3, s))//行,列,矩阵数据类型(深度和通道数),图像颜色
{
using (new Window("zx6161", WindowMode.AutoSize, zx6161))
{
Cv2.WaitKey();//等待用户按键
}
}
运行结果:
四/创建一个已知图像一样大小和类型的纯黑色图片
using (var zx61 = new Mat("./data/test.jpg", ImreadModes.AnyColor ))
using (var zx6161 = new Mat(zx61.Size(), zx61.Type(), Scalar.All(0)))//大小,类型,颜色
{
//zx6161.Create();//此处伏笔,可以用来复制/合成图像等操作
//using (new Window("zx61", WindowMode.AutoSize, zx61))
Cv2.ImShow("zx61", zx61);//和上一行代码一个意思
using (new Window("zx6161", WindowMode.AutoSize, zx6161))
{
Cv2.WaitKey();
}
}
五/输出一个Mat对象的所有像素值
/// <summary>
/// 输出一个Mat对象的所有像素值
/// tip:执行过程非常快但是 WriteLine 比较耗时....所以你感觉得慢是假象...
/// </summary>
/// <param name="path"></param>
public static void getpixel1(string path)
{
Mat zx61 = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth);
for (int i = 0; i < zx61.Height; i++)
{
for (int j = 0; j < zx61.Width; j++)
{
Vec3b color = zx61.Get<Vec3b>(i, j); //new Vec3b(); 颜色通道类型(字节的三元组) ,直接视同Get泛型方法返回指定类型
//单独获取指定通道像素
//color.Item0= zx61.Get<Vec3b>(i, j).Item0; //R
//color.Item1 = zx61.Get<Vec3b>(i, j).Item1; //G
//color.Item2 = zx61.Get<Vec3b>(i, j).Item2; //B
Console.WriteLine(color.Item0 + "," + color.Item1 + "," + color.Item2);
}
}
Console.WriteLine($"图像高度:{zx61.Height}");
Console.WriteLine($"图像宽度:{zx61.Width}");
using (new Window("zx61", WindowMode.AutoSize, zx61))
{
Cv2.WaitKey();
}
}
运行结果:
六/使用指针获取一个像素值和图像的行列值
unsafe static void Main(string[] args)
{
getpixel2("./data/test.jpg");
}
/// <summary>
/// 使用指针获取一个像素值和图像的行列值
/// 操作指针要加 unsafe
/// 调用他的所有函数,包括Main函数都要加 unsafe
/// </summary>
unsafe public static void getpixel2(string path)
{
Mat zx61 = new Mat(path, ImreadModes.AnyColor);
Mat zx6161 = new Mat();
zx61.CopyTo(zx6161); //拷贝
Console.WriteLine($"拷贝前后颜色通道比较:{ zx61.Channels()== zx6161.Channels()}"); //拷贝前后颜色通道比较
int row = zx6161.Rows; //行
int clo = zx6161.Cols; //列
Console.WriteLine($"Rows :{row} ;Cols :{clo}");
//像素总数行*列
//指针获取值(根据下标),第一个像素值
IntPtr c = zx6161.Ptr(0); //Mat对象的 Ptr方法:返回指向指定矩阵行的指针。
byte* c1 = (byte*)c; //像素值在C#中是byte类型 ,在C++中是 uchar类型
byte* c100 = (byte*)zx6161.Ptr(99);
Console.WriteLine($"第1个像素值:{*c1}");
Console.WriteLine($"第100个像素值:{*c100}");
using (new Window("Create", WindowMode.AutoSize, zx6161))
using (new Window("InputImage", WindowMode.AutoSize, zx6161))
{
Cv2.WaitKey();
}
}