访问图片
//默认彩色模式打开 Mat srcImg = CvInvoke.Imread(@"C:\Users\Administrator\Desktop\22.jpg", LoadImageType.Color); if (srcImg.IsEmpty) { Console.WriteLine("文件图片找不到"); return; } Console.WriteLine($"图像宽度为:{srcImg.Cols}");//获取图片的列 Console.WriteLine($"图像高度为:{srcImg.Rows}");//获取图片的行 Console.WriteLine($"图像通道数为:{srcImg.NumberOfChannels}");//获取图片通道数 CvInvoke.NamedWindow("srcImg window", NamedWindowType.AutoSize); CvInvoke.Imshow("srcImg window", srcImg); CvInvoke.CvtColor(srcImg, srcImg, ColorConversion.Bgr2Gray);//转化为灰度图像 CvInvoke.Imshow("outImg window", srcImg); CvInvoke.WaitKey(0); CvInvoke.DestroyWindow("srcImg window");//销毁指定窗口 CvInvoke.DestroyAllWindows();//销毁所有窗口
点、矩形框
Point pt = new Point(100, 100); pt.X = 10; pt.Y = 20; Rectangle rect = new Rectangle(); rect.X = 10; rect.Y = 20; rect.Width = 100; rect.Height = 200; bool bFlg = rect.Contains(new Point(0,0));//判断点是否在矩形框内 Size size = rect.Size; //MCvScalar mCvScalar = new MCvScalar(); Mat img = new Mat(500,500,DepthType.Cv8U,3); img.SetTo(new MCvScalar(0, 0, 0)); CvInvoke.Line(img, new Point(10, 10), new Point(250, 250), new MCvScalar(0, 255, 0),2,LineType.EightConnected); CvInvoke.Circle(img, new Point(250, 250), 100, new MCvScalar(0, 0, 255), 2); CvInvoke.Circle(img, new Point(350, 350), 100, new MCvScalar(0, 0, 255), -1); CvInvoke.Rectangle(img, new Rectangle(100, 100, 300, 200), new MCvScalar(255, 0, 0), 2); CvInvoke.Rectangle(img, new Rectangle(50, 50, 300, 200), new MCvScalar(255, 0, 0), -1); //椭圆 CvInvoke.Ellipse(img, new RotatedRect(new PointF(100, 110), new SizeF(300, 200),0),new MCvScalar(0,255,255),2,LineType.FourConnected); CvInvoke.Ellipse(img, new Point(250, 250), new Size(150, 100), 0, 0, 360, new MCvScalar(0, 0, 255), 2); CvInvoke.PutText(img, "hello world", new Point(100, 100), FontFace.HersheyComplex, 2, new MCvScalar(255, 255, 0), 5); CvInvoke.Imshow("--->", img); CvInvoke.WaitKey(0);
访问图像像素
//索引访问 { Console.WriteLine("通过索引访问像素值"); Image<Bgr, Byte> img = new Image<Bgr, byte>(@"C:\Users\Administrator\Desktop\22.jpg"); for (int i = 0; i < img.Rows; i++) { for (int j = 0; j < img.Cols; j++) { if (i==j) { img[i,j] = new Bgr(0, 0, 255);//把第i行,第j列设置成红色 } } } CvInvoke.Imshow("Image",img); CvInvoke.WaitKey(0); } //Data访问 { Console.WriteLine("通过Data索引访问,速度比较快 返回TDepth类型"); //单通道灰度图像像素访问 Image<Bgr, Byte> img = new Image<Bgr, byte>(@"C:\Users\Administrator\Desktop\22.jpg"); for (int i = 0; i < img.Rows; i++) { for (int j = 0; j < img.Cols; j++) { if (i == j) { img.Data[i, j, 0] = 0;//像素值改变赋值(第100行100列 0通道)蓝 img.Data[i, j, 1] = 255;//像素值改变赋值(第100行100列 0通道)//绿 img.Data[i, j, 2] = 0;//像素值改变赋值(第100行100列 0通道)//红 //img[i, j] = new Bgr(0, 0, 255);//把第i行,第j列设置成红色 } } } CvInvoke.Imshow("Image", img); CvInvoke.WaitKey(0); }
Image类与Mat类的转化
Console.WriteLine("Image类与Mat类的转换"); //Image类转Mat Image<Bgr, Byte> img = new Image<Bgr, byte>(@"C:\Users\Administrator\Desktop\22.jpg"); Mat matResult = img.Mat; //Mat转Image类 Mat img2 = CvInvoke.Imread(@"C:\Users\Administrator\Desktop\22.jpg", LoadImageType.Color); Image<Bgr, Byte> result = img2.ToImage<Bgr, Byte>();