四、线段、矩形、圆、椭圆、自定义多边形、边缘轮廓和文本绘制(OpenCvSharp)

功能实现:
对指定图片上进行绘制线段、矩形、圆、椭圆、自定义多边形、边缘轮廓以及自定义文本

一、布局

用到了一个pictureBox和八个button
在这里插入图片描述

二、引入命名空间

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using OpenCvSharp;
// using Point = OpenCvSharp.Point;
using OpenCvSharp.Extensions;

在这里插入图片描述
要有这三个哈,没有就去浏览里面搜索下载安装就行
在这里插入图片描述

三、功能实现

1,OpenPicture,选择图片

定义全局变量picture用于存放读取的图片的位置

OpenFileDialog file = new OpenFileDialog();
new一个OpenFileDialog 类对象file,用于打开选择图片
OpenFileDialog 类官网API

if (file.FileName != string.Empty)
此时file.FileName就是图片的路径,是一个字符串数据

pictureBox1.Load(file.FileName);
pictureBox1就是布局里面的PictureBox控件名称
参数是图片的路径,这里传入用户选择的图片路径file.FileName
此时就可以将用户选择的照片显示在PictureBox控件上

private string picture = ""; // 全局变量存放读取图片的路径private void button1_Click(object sender, EventArgs e)
{OpenFileDialog file = new OpenFileDialog();file.InitialDirectory = ".";file.Filter = "所有文件(*.*)|*.*";file.ShowDialog();if (file.FileName != string.Empty){try{picture = file.FileName;this.pictureBox1.Load(file.FileName);Console.WriteLine("picture path is: " + picture);}catch (Exception ex){MessageBox.Show(ex.Message);}}  
}

运行效果展示:
这里为了更加方便展示功能,制作了一个纯黑的图片(1000×400)
在这里插入图片描述

2,Line,绘制线段

Mat src_line = new Mat();
src_line = Cv2.ImRead(this.picture, ImreadModes.Color);
创建一个Mat对象src_line ,用于存放读取的图片

OpenCvSharp.Point pt1, pt2;
pt1.X = 10; pt1.Y = 20; pt2.X = 50; pt2.Y = 60;
设置线段的起点终点坐标

Scalar scalar = new Scalar(0, 0, 255); // BGR
线段颜色,红色

Cv2.Line(src_line, pt1, pt2, scalar, 2, LineTypes.AntiAlias, 0);
参数一:src_line,要绘制的图片
参数二:pt1,起点
参数三:pt2,终点
参数四:scalar,线段颜色红色
参数五:2,线段粗细,越大越粗
参数六:LineTypes.AntiAlias,线段的类型
参数七:0,shift为0,表示缩放程度,无放缩
Cv2.Line Method (InputOutputArray, Int32, Int32, Int32, Int32, Scalar, Int32, LineTypes, Int32)

Bitmap bitmap_line = src_line.ToBitmap();
因为OpenCV读取的是Mat类型的图片,而pictureBox控件只能显示Bitmap和Image类型的数据,故需要将Mat转换为Bitmap
Mat、Bitmap和Image数据格式之间的相互转换可参考博文:三、Mat、Bitmap和Image数据类型之间的转换(OpenCvSharp)

pictureBox1.Image = bitmap_line;
将绘制好的Bitmap图片在pictureBox1控件上展示

private void button2_Click(object sender, EventArgs e)
{Mat src_line = new Mat();src_line = Cv2.ImRead(this.picture, ImreadModes.Color);// 设置线段的起点和终点的位置OpenCvSharp.Point pt1, pt2;pt1.X = 10;pt1.Y = 20;pt2.X = 50;pt2.Y = 60;// OpenCvSharp.Point pt1 = new OpenCvSharp.Point(100, 400);// OpenCvSharp.Point pt2 = new OpenCvSharp.Point(200, 800);Scalar scalar = new Scalar(0, 0, 255); // BGRCv2.Line(src_line, pt1, pt2, scalar, 2, LineTypes.AntiAlias, 0);Bitmap bitmap_line = src_line.ToBitmap();pictureBox1.Image = bitmap_line;// Cv2.ImShow("src",src);// Cv2.WaitKey(0);
}

运行效果展示:
横x轴,竖y轴
在这里插入图片描述

3,Rectangle,绘制矩形框

Mat src_rectangle = new Mat();
src_rectangle = Cv2.ImRead(this.picture, ImreadModes.Color);
创建一个Mat对象src_rectangle ,用于存放读取的图片

OpenCvSharp.Point pt1 = new OpenCvSharp.Point(10, 20);
OpenCvSharp.Point pt2 = new OpenCvSharp.Point(20, 50);
设置左上角和右下角的坐标位置

Scalar scalar = new Scalar(0, 255, 0);
设置线段颜色BGR,这里是绿色

Cv2.Rectangle(src_rectangle, pt1, pt2, scalar, 2, LineTypes.Link4, 0);
参数一:src_rectangle,要绘制的图片
参数二:pt1,矩形左上角坐标位置
参数三:pt2,矩形右下角坐标位置
参数四:scalar,线段颜色绿色
参数五:2,线段粗细,越大越粗
参数六:LineTypes.Link4,线段的类型
参数七:0,shift为0,表示缩放程度,无放缩
Cv2.Rectangle Method (Mat, Rect, Scalar, Int32, LineTypes, Int32)

Bitmap bitmap_rect = src_rectangle.ToBitmap();
因为OpenCV读取的是Mat类型的图片,而pictureBox控件只能显示Bitmap和Image类型的数据,故需要将Mat转换为Bitmap

pictureBox1.Image = bitmap_rect;
将绘制好的Bitmap图片在pictureBox1控件上展示

private void button3_Click(object sender, EventArgs e)
{Mat src_rectangle = new Mat();src_rectangle = Cv2.ImRead(this.picture, ImreadModes.Color);// 设置矩形的左上和右下点的位置OpenCvSharp.Point pt1 = new OpenCvSharp.Point(10, 20);OpenCvSharp.Point pt2 = new OpenCvSharp.Point(20, 50);Scalar scalar = new Scalar(0, 255, 0); // BGRCv2.Rectangle(src_rectangle, pt1, pt2, scalar, 2, LineTypes.Link4, 0);Bitmap bitmap_rect = src_rectangle.ToBitmap();pictureBox1.Image = bitmap_rect;
}

运行效果展示:
在这里插入图片描述

4,Circle,绘制圆形

Mat src_circle = new Mat();
src_circle = Cv2.ImRead(this.picture, ImreadModes.Color);
创建一个Mat对象src_circle ,用于存放读取的图片

OpenCvSharp.Point pt1 = new OpenCvSharp.Point(100, 60);
设置圆心坐标位置

Cv2.Circle(src_circle, pt1, 50, new Scalar(255, 0, 0), 2, LineTypes.Link8, 0);
参数一:src_circle,要绘制的图片
参数二:pt1,圆心坐标位置
参数三:50,圆的半径
参数四:new Scalar(255, 0, 0),BGR,线段颜色蓝色
参数五:2,线段粗细,越大越粗
参数六:LineTypes.Link8,线段的类型
参数七:0,shift为0,表示缩放程度,无放缩
Cv2.Circle Method (InputOutputArray, Point, Int32, Scalar, Int32, LineTypes, Int32)

Bitmap bitmap_circle = src_circle.ToBitmap();
因为OpenCV读取的是Mat类型的图片,而pictureBox控件只能显示Bitmap和Image类型的数据,故需要将Mat转换为Bitmap

pictureBox1.Image = bitmap_circle;
将绘制好的Bitmap图片在pictureBox1控件上展示

private void button4_Click(object sender, EventArgs e)
{Mat src_circle = new Mat();src_circle = Cv2.ImRead(this.picture, ImreadModes.Color);// 设置圆心位置OpenCvSharp.Point pt1 = new OpenCvSharp.Point(100, 60);Scalar scalar = new Scalar(255, 0, 0); // BGRCv2.Circle(src_circle, pt1, 50, scalar, 2, LineTypes.Link8, 0);Bitmap bitmap_circle = src_circle.ToBitmap();pictureBox1.Image = bitmap_circle;
}

运行效果展示:
在这里插入图片描述

5,Ellipse,绘制椭圆

Mat src_ellipse = new Mat();
src_ellipse = Cv2.ImRead(this.picture, ImreadModes.Color);
创建一个Mat对象src_circle ,用于存放读取的图片

OpenCvSharp.Point pt;
pt.X = 60; pt.Y = 60;
设置椭圆中心位置

OpenCvSharp.Size size;
size.Width = 50; size.Height = 10;
设置长半轴(size.Width,黄色)和短半轴(size.Height,蓝色)
在这里插入图片描述
Scalar scalar = new Scalar(255, 0, 255);
设置绘制线段的颜色BGR,蓝+红=紫

Cv2.Ellipse(src_ellipse, pt, size, 270, 0, 270, scalar, 2, LineTypes.AntiAlias, 0);
参数一:src_ellipse,要绘制的图片
参数二:pt,椭圆圆心坐标位置
参数三:size,椭圆的长半轴和短半轴
参数四:270,椭圆的角度
参数五:0,开始的角度,竖直为0度,也就是12点钟位置
参数六:270,结束的角度,顺时针转270度
参数七:scalar,BGR,线段颜色紫色
参数八:2,线段粗细,越大越粗
参数九:LineTypes.AntiAlias,线段的类型
参数十:0,shift为0,表示缩放程度,无放缩
Cv2.Ellipse Method (InputOutputArray, Point, Size, Double, Double, Double, Scalar, Int32, LineTypes, Int32)

Bitmap bitmap_ellipse = src_ellipse.ToBitmap();
因为OpenCV读取的是Mat类型的图片,而pictureBox控件只能显示Bitmap和Image类型的数据,故需要将Mat转换为Bitmap

pictureBox1.Image = bitmap_ellipse;
将绘制好的Bitmap图片在pictureBox1控件上展示

private void button5_Click(object sender, EventArgs e)
{Mat src_ellipse = new Mat();src_ellipse = Cv2.ImRead(this.picture, ImreadModes.Color);// 设置椭圆中心位置OpenCvSharp.Point pt;pt.X = 60;pt.Y = 60;// 设置长半轴和短半轴OpenCvSharp.Size size;size.Width = 50;size.Height = 10;Scalar scalar = new Scalar(255, 0, 255); // BGRCv2.Ellipse(src_ellipse, pt, size, 270, 0, 270, scalar, 2, LineTypes.AntiAlias, 0);Bitmap bitmap_ellipse = src_ellipse.ToBitmap();pictureBox1.Image = bitmap_ellipse;
}

运行效果展示:
在这里插入图片描述

6,Polylines,绘制多边形

Mat src_poly = new Mat();
src_poly = Cv2.ImRead(this.picture, ImreadModes.Color);
创建一个Mat对象src_poly ,用于存放读取的图片

// pt1是一个三角形,一定要密闭哈,回归原来的起始点坐标
// pt1是一个矩形List<OpenCvSharp.Point> pts1 = new List<OpenCvSharp.Point>
{new OpenCvSharp.Point(30,10),new OpenCvSharp.Point(50,50),new OpenCvSharp.Point(10,50),new OpenCvSharp.Point(30,10)
};List<OpenCvSharp.Point> pts2 = new List<OpenCvSharp.Point>
{new OpenCvSharp.Point(70,10),new OpenCvSharp.Point(100,10),new OpenCvSharp.Point(100,50),new OpenCvSharp.Point(70,50),new OpenCvSharp.Point(70,10)
};

List<List<OpenCvSharp.Point>> pts = new List<List<OpenCvSharp.Point>>() { pts1, pts2 };
pts是俩多边形坐标点的位置,一个是pts1三角形,另一个是pts2矩形

Cv2.Polylines(src_poly, pts, true, new Scalar(0, 255, 255), 2, LineTypes.AntiAlias, 0);
参数一:src_poly,要绘制的图片
参数二:pts,待绘制多边形的各个点的位置坐标
参数三:true,是否闭合,因为这边绘制多边形的时候回到最初的位置了,是闭合的区域
参数四:new Scalar(0, 255, 255),BGR,线段颜色黄色
参数五:2,线段粗细,越大越粗
参数六:LineTypes.AntiAlias,线段的类型
参数七:0,shift为0,表示缩放程度,无放缩
Cv2.Polylines Method (InputOutputArray, InputArray, Boolean, Scalar, Int32, LineTypes, Int32)

Bitmap bitmap_poly = src_poly.ToBitmap();
因为OpenCV读取的是Mat类型的图片,而pictureBox控件只能显示Bitmap和Image类型的数据,故需要将Mat转换为Bitmap

pictureBox1.Image = bitmap_poly;
将绘制好的Bitmap图片在pictureBox1控件上展示

private void button6_Click(object sender, EventArgs e)
{Mat src_poly = new Mat();src_poly = Cv2.ImRead(this.picture, ImreadModes.Color);List<OpenCvSharp.Point> pts1 = new List<OpenCvSharp.Point>{new OpenCvSharp.Point(30,10),new OpenCvSharp.Point(50,50),new OpenCvSharp.Point(10,50),new OpenCvSharp.Point(30,10)};List<OpenCvSharp.Point> pts2 = new List<OpenCvSharp.Point>{new OpenCvSharp.Point(70,10),new OpenCvSharp.Point(100,10),new OpenCvSharp.Point(100,50),new OpenCvSharp.Point(70,50),new OpenCvSharp.Point(70,10)};List<List<OpenCvSharp.Point>> pts = new List<List<OpenCvSharp.Point>>() { pts1, pts2 };Cv2.Polylines(src_poly, pts, true, new Scalar(0, 255, 255), 2, LineTypes.AntiAlias, 0);Bitmap bitmap_poly = src_poly.ToBitmap();pictureBox1.Image = bitmap_poly;
}

运行效果展示:
在这里插入图片描述

7,DrawContours,绘制轮廓

Mat src_contour = new Mat();
src_contour = Cv2.ImRead(this.picture, ImreadModes.Color);
创建一个Mat对象src_contour,用于存放读取的图片

// 五边形
List<OpenCvSharp.Point> pts1 = new List<OpenCvSharp.Point>
{new OpenCvSharp.Point(40,40),new OpenCvSharp.Point(40,50),new OpenCvSharp.Point(50,50),new OpenCvSharp.Point(50,40),new OpenCvSharp.Point(45,20),new OpenCvSharp.Point(40,40)
};

List<List<OpenCvSharp.Point>> pts = new List<List<OpenCvSharp.Point>>() { pts1 };
pts是一个五边形pts1

Cv2.DrawContours(src_contour, pts, -1, new Scalar(0, 255, 0), 1, LineTypes.AntiAlias);
参数一:src_contour,要绘制的图片
参数二:pts,待绘制轮廓的多边形点的坐标位置
参数三:-1,绘制哪个轮廓,-1表示所有的多边形轮廓都绘制
参数四:new Scalar(0, 255, 0),BGR,线段颜色绿色
参数五:-1,线段粗细,越大越粗,-1表示填充该多边形
参数六:LineTypes.AntiAlias,线段的类型
Cv2.DrawContours Method (InputOutputArray, IEnumerable, Int32, Scalar, Int32, LineTypes, Mat, Int32, Nullable)

Bitmap bitmap_contour = src_contour.ToBitmap();
因为OpenCV读取的是Mat类型的图片,而pictureBox控件只能显示Bitmap和Image类型的数据,故需要将Mat转换为Bitmap

pictureBox1.Image = bitmap_contour;
将绘制好的Bitmap图片在pictureBox1控件上展示

private void button7_Click(object sender, EventArgs e)
{Mat src_contour = new Mat();src_contour = Cv2.ImRead(this.picture, ImreadModes.Color);List<OpenCvSharp.Point> pts1 = new List<OpenCvSharp.Point>{new OpenCvSharp.Point(40,40),new OpenCvSharp.Point(40,50),new OpenCvSharp.Point(50,50),new OpenCvSharp.Point(50,40),new OpenCvSharp.Point(45,20),new OpenCvSharp.Point(40,40)};List<List<OpenCvSharp.Point>> pts = new List<List<OpenCvSharp.Point>>() { pts1 };Cv2.DrawContours(src_contour, pts, -1, new Scalar(0, 255, 0), -1, LineTypes.AntiAlias);Bitmap bitmap_contour = src_contour.ToBitmap();pictureBox1.Image = bitmap_contour;
}

运行效果展示:
在这里插入图片描述

8,PutText,绘制文字

Mat src_text = new Mat();
src_text = Cv2.ImRead(this.picture, ImreadModes.Color);
创建一个Mat对象src_text ,用于存放读取的图片

OpenCvSharp.Point pt = new OpenCvSharp.Point(200, 200);
设置文字的起始位置,左上角坐标

Cv2.PutText(src_text, "beyondyanyu", pt, HersheyFonts.Italic, 3, new Scalar(0, 255, 0), 1, LineTypes.Link8, false);
参数一:src_text,要绘制的图片
参数二:“beyondyanyu”,待绘制文本内容
参数三:pt,文字左上角坐标位置
参数四:HersheyFonts.Italic,字体类型
参数五:3,字体范围
参数六:new Scalar(0, 255, 0),BGR,线段颜色绿色
参数七:1,线段粗细,越大越粗
Cv2.PutText Method

Bitmap bitmap_text = src_text.ToBitmap();
因为OpenCV读取的是Mat类型的图片,而pictureBox控件只能显示Bitmap和Image类型的数据,故需要将Mat转换为Bitmap

pictureBox1.Image = bitmap_text;
将绘制好的Bitmap图片在pictureBox1控件上展示

private void button8_Click(object sender, EventArgs e)
{Mat src_text = new Mat();src_text = Cv2.ImRead(this.picture, ImreadModes.Color);OpenCvSharp.Point pt = new OpenCvSharp.Point(200, 200);Cv2.PutText(src_text,"beyondyanyu",pt,HersheyFonts.Italic,3, new Scalar(0, 255, 0),1,LineTypes.Link8,false);Bitmap bitmap_text = src_text.ToBitmap();pictureBox1.Image = bitmap_text;
}

运行效果展示:
在这里插入图片描述

四、完整代码

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using OpenCvSharp;
// using Point = OpenCvSharp.Point;
using OpenCvSharp.Extensions;namespace Study_Point
{public partial class Form1 : Form{private string picture = ""; // 全局变量存放读取图片的路径public Form1(){InitializeComponent();}/// <summary>/// 选择图片/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){OpenFileDialog file = new OpenFileDialog();file.InitialDirectory = ".";file.Filter = "所有文件(*.*)|*.*";file.ShowDialog();if (file.FileName != string.Empty){try{picture = file.FileName;this.pictureBox1.Load(file.FileName);Console.WriteLine("picture path is: " + picture);}catch (Exception ex){MessageBox.Show(ex.Message);}}  }/// <summary>/// 画线段/// 参数一:src_line,要绘制的图片/// 参数二:pt1,起点/// 参数三:pt2,终点/// 参数四:scalar,线段颜色/// 参数五:2,线段粗细,越大越粗/// 参数六:LineTypes.AntiAlias,线段的类型/// 参数七:0,shift为0/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button2_Click(object sender, EventArgs e){Mat src_line = new Mat();src_line = Cv2.ImRead(this.picture, ImreadModes.Color);// 设置线段的起点和终点的位置OpenCvSharp.Point pt1, pt2;pt1.X = 10;pt1.Y = 20;pt2.X = 50;pt2.Y = 60;// OpenCvSharp.Point pt1 = new OpenCvSharp.Point(100, 400);// OpenCvSharp.Point pt2 = new OpenCvSharp.Point(200, 800);Scalar scalar = new Scalar(0, 0, 255); // BGRCv2.Line(src_line, pt1, pt2, scalar, 2, LineTypes.AntiAlias, 0);Bitmap bitmap_line = src_line.ToBitmap();pictureBox1.Image = bitmap_line;// Cv2.ImShow("src",src);// Cv2.WaitKey(0);}/// <summary>/// 绘制矩形框/// 参数一:src_rectangle,要绘制的图片/// 参数二:pt1,矩形左上角坐标/// 参数三:pt2,矩形右下角坐标/// 参数四:scalar,线段颜色/// 参数五:2,线段粗细,越大越粗;-1表示填充/// 参数六:LineTypes.Link4,线段的类型/// 参数七:0,shift为0/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){Mat src_rectangle = new Mat();src_rectangle = Cv2.ImRead(this.picture, ImreadModes.Color);// 设置矩形的左上和右下点的位置OpenCvSharp.Point pt1 = new OpenCvSharp.Point(10, 20);OpenCvSharp.Point pt2 = new OpenCvSharp.Point(20, 50);Scalar scalar = new Scalar(0, 255, 0); // BGRCv2.Rectangle(src_rectangle, pt1, pt2, scalar, 2, LineTypes.Link4, 0);Bitmap bitmap_rect = src_rectangle.ToBitmap();pictureBox1.Image = bitmap_rect;}/// <summary>/// 画圆/// 参数一:src_circle,要绘制的图片/// 参数二:pt1,圆心坐标/// 参数三:50,圆的半径/// 参数四:scalar,线段颜色/// 参数五:2,线段粗细,越大越粗;-1表示填充/// 参数六:LineTypes.Link8,线段的类型/// 参数七:0,shift为0/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button4_Click(object sender, EventArgs e){Mat src_circle = new Mat();src_circle = Cv2.ImRead(this.picture, ImreadModes.Color);// 设置圆心位置OpenCvSharp.Point pt1 = new OpenCvSharp.Point(100, 60);Cv2.Circle(src_circle, pt1, 50, new Scalar(255, 0, 0), 2, LineTypes.Link8, 0);Bitmap bitmap_circle = src_circle.ToBitmap();pictureBox1.Image = bitmap_circle;}/// <summary>/// 绘制椭圆/// 参数一:src_ellipse,处理的图片/// 参数二:pt,椭圆的中心点/// 参数三:size,半长轴和半短轴的长度/// 参数四:270,总共的角度/// 参数五:0,开始的角度/// 参数六:270,结束的角度/// 参数七:scalar,绘制的颜色/// 参数八:2,线条的宽度,-1表示填充/// 参数九:LineTypes.AntiAlias,绘制线条的类型/// 参数十:0,shift为0/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button5_Click(object sender, EventArgs e){Mat src_ellipse = new Mat();src_ellipse = Cv2.ImRead(this.picture, ImreadModes.Color);// 设置椭圆中心位置OpenCvSharp.Point pt;pt.X = 60;pt.Y = 60;// 设置长半轴和短半轴OpenCvSharp.Size size;size.Width = 50;size.Height = 10;Scalar scalar = new Scalar(255, 0, 255); // BGRCv2.Ellipse(src_ellipse, pt, size, 270, 0, 270, scalar, 2, LineTypes.AntiAlias, 0);Bitmap bitmap_ellipse = src_ellipse.ToBitmap();pictureBox1.Image = bitmap_ellipse;}/// <summary>/// 绘制多边形/// 参数一:src_poly,待处理的图片/// 参数二:pts,绘制多边形坐标,这里是两个多边形pt1和pt2/// 参数三:true,是否是闭合的/// 参数四:绘制的线段的颜色/// 参数五:绘制的线段的宽度/// 参数六:LineTypes.AntiAlias,线段的类型/// 参数七:0,shift为0/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button6_Click(object sender, EventArgs e){Mat src_poly = new Mat();src_poly = Cv2.ImRead(this.picture, ImreadModes.Color);List<OpenCvSharp.Point> pts1 = new List<OpenCvSharp.Point>{new OpenCvSharp.Point(30,10),new OpenCvSharp.Point(50,50),new OpenCvSharp.Point(10,50),new OpenCvSharp.Point(30,10)};List<OpenCvSharp.Point> pts2 = new List<OpenCvSharp.Point>{new OpenCvSharp.Point(70,10),new OpenCvSharp.Point(100,10),new OpenCvSharp.Point(100,50),new OpenCvSharp.Point(70,50),new OpenCvSharp.Point(70,10)};List<List<OpenCvSharp.Point>> pts = new List<List<OpenCvSharp.Point>>() { pts1, pts2 };Cv2.Polylines(src_poly, pts, false, new Scalar(0, 255, 255), 2, LineTypes.AntiAlias, 0);Bitmap bitmap_poly = src_poly.ToBitmap();pictureBox1.Image = bitmap_poly;}/// <summary>/// 绘制轮廓/// 参数一:src_contour,绘制的图片/// 参数二:pts,绘制的多边形/// 参数三:-1,轮廓索引,看需要绘制那个轮廓,-1表示所有轮廓全都绘制/// 参数四:绘制线段的颜色/// 参数五:绘制线段的宽度,-1表示填充/// 参数六:LineTypes.AntiAlias,线段的类型/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button7_Click(object sender, EventArgs e){Mat src_contour = new Mat();src_contour = Cv2.ImRead(this.picture, ImreadModes.Color);List<OpenCvSharp.Point> pts1 = new List<OpenCvSharp.Point>{new OpenCvSharp.Point(40,40),new OpenCvSharp.Point(40,50),new OpenCvSharp.Point(50,50),new OpenCvSharp.Point(50,40),new OpenCvSharp.Point(45,20),new OpenCvSharp.Point(40,40)};List<List<OpenCvSharp.Point>> pts = new List<List<OpenCvSharp.Point>>() { pts1 };Cv2.DrawContours(src_contour, pts, -1, new Scalar(0, 255, 0), -1, LineTypes.AntiAlias);Bitmap bitmap_contour = src_contour.ToBitmap();pictureBox1.Image = bitmap_contour;}/// <summary>/// 绘制文本内容/// 参数一:src_text,待处理的图片/// 参数二:"beyondyanyu",绘制的文本字符串内容/// 参数三:pt,绘制文字的左上角坐标位置/// 参数四:HersheyFonts.Italic,字体的类型/// 参数五:3,字体的范围/// 参数六:绘制字体的颜色/// 参数七:1,绘制线条的宽度/// 参数八:LineTypes.AntiAlias,线段的类型/// 参数九:false,是否bottomLeftOrigin/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button8_Click(object sender, EventArgs e){Mat src_text = new Mat();src_text = Cv2.ImRead(this.picture, ImreadModes.Color);OpenCvSharp.Point pt = new OpenCvSharp.Point(200, 200);Cv2.PutText(src_text, "beyondyanyu", pt, HersheyFonts.Italic, 3, new Scalar(0, 255, 0), 1, LineTypes.Link8, false);Bitmap bitmap_text = src_text.ToBitmap();pictureBox1.Image = bitmap_text;}}
}

完整运行效果展示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/5446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL | 第九篇】重新认识MySQL锁

文章目录 9.重新认识MySQL锁9.1MySQL锁概述9.2锁分类9.2.1锁的粒度9.2.2锁的区间9.2.3锁的性能9.2.4锁的级别 9.3拓展&#xff1a;意向锁9.3.1意向锁概述9.3.2意向锁分类9.3.3意向锁作用&#xff08;1&#xff09;意向锁的兼容互斥性&#xff08;2&#xff09;例子1&#xff08…

【Flutter】极光推送配置流程(小米厂商通道) 章二

前言 继【Flutter】极光推送配置流程(极光通道/华为厂商/IOS) 章一 并且&#xff0c;我大概率不会去修改第一篇文章的内容。 随着我自己在配置公司的项目的同时&#xff0c;我希望一直更新这个推送系列文章。 在章一配置完后&#xff0c;也是出现了一些问题&#xff0c;所以本…

PHP算命源码_最新测算塔罗源码_可以运营

众筹商城源码 众筹商品平台 商城加共识元富之路 网上商城众筹 前端是编译后的&#xff0c;后端PHP&#xff0c;带商城 运行截图 源码贡献 https://githubs.xyz/boot?app39 部分数据库表 CREATE TABLE ti_shopro_store (id int(11) NOT NULL AUTO_INCREMENT COMMENT ID,nam…

当Kubeflow遇上GPU池化

随着人工智能技术的迅猛发展&#xff0c;AI开发已成为企业创新的重要驱动力。然而&#xff0c;在AI开发过程中&#xff0c;企业面临着诸多挑战&#xff0c;如开发工具的选择和开发资源如何高效利用等。本文将围绕这些挑战&#xff0c;探讨GPU池化如何赋能Kubeflow进行AI开发&am…

实验八智能手机互联网程序设计(微信程序方向)实验报告

请在上一次实验的基础之上完成“手机快速注册”页面、“企业用户注册”页面&#xff0c;并实现点击手机快速注册和企业用户注册后转跳至该页面在“手机快速注册”页面&#xff0c;输入框内输入内容并失去焦点后&#xff0c;下方的按钮会变化 在企业用户注册页面&#xff0c;用户…

【网站项目】木里风景文化管理平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

在Linux操作系统中的磁盘分区管理案例

1.在硬盘sdb上创建不同的分区实例练习 Linux操作系统是安装在硬盘sda硬盘中&#xff0c;所以不要轻易动硬盘sda中的文件信息 有如下需求 创建主分区 500M 文件系统 ext4 挂载点 /web 创建主分区 500M 文件系统 ext4 挂载点 /nginx 创建逻辑分区 500M 文件系…

【webrtc】MessageHandler 4: 基于线程的消息处理:以Fake 收发包模拟为例

G:\CDN\rtcCli\m98\src\media\base\fake_network_interface.h// Fake NetworkInterface that sends/receives RTP/RTCP packets.虚假的网络接口,用于模拟发送包、接收包单纯仅是处理一个ST_RTP包 消息的id就是ST_RTP 类型,– 然后给到目的地:mediachannel处理: 最后消息消…

GPT3 终极指南(二)

原文&#xff1a;zh.annas-archive.org/md5/6de8906c86a2711a5a84c839bec7e073 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第五章&#xff1a;GPT-3 作为企业创新的下一步 当一个新的创新或技术转变发生时&#xff0c;大公司通常是最后一个采纳的。它们的等级结构…

虚拟机安装与配置win7

一、安装镜像 Windows7 64位 ed2k://|file|cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso|3420557312|B58548681854236C7939003B583A8078|/ 建议迅雷下载 二、VMware 安装win7 1.新创自定义虚拟机 2.默认即可 3.iso文件我们自己下载&#xff0c;选择一个空的磁盘 4.…

【记录】Python3| 将 PDF 转换成 HTML/XML(✅⭐⭐⭐⭐pdf2htmlEX)

本文将会被汇总至 【记录】Python3&#xff5c;2024年 PDF 转 XML 或 HTML 的第三方库的使用方式、测评过程以及对比结果&#xff08;汇总&#xff09;&#xff0c;更多其他工具请访问该文章查看。 文章目录 pdf2htmlEX 使用体验与评估1 安装指南2 测试代码3 测试结果3.1 转 HT…

闪存存储和制造技术概述

闪存存储技术 引言 性能由高到低排序&#xff1a;SLC -> MLC -> TLC -> QLC 根据这个排序读写速度也越来越低&#xff0c;价格越来越便宜 1. SLC SLC&#xff08;Single-Level Cell&#xff0c;单层单元&#xff09;&#xff1a; SLC 闪存具有最高的性能、耐用性和可…

【专篇】DDR3 SDRAM-01总体介绍

概念 DDR3 SDRAM(Double-Data-Rate 3 Synchronous Dynamic Random-Access Memory,第三代双倍速率同步动态随机存取存储器)是计算机存储技术的一种重要进步,它在前代DDR2 SDRAM的基础上进行了多项改进和优化。以下是DDR3 SDRAM的特点介绍: 双倍速率(DDR):DDR3 SDRAM采用…

c#数据库: 4.修改学生成绩

将4年级的学生成绩全部修改为100分,。修改前的学生信息表如图所示: using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks;namespace StudentUpdate {internal class Program{s…

Ubuntu如何更换 PyTorch 版本

环境&#xff1a; Ubuntu22.04 WLS2 问题描述&#xff1a; Ubuntu如何更换 PyTorch 版本考虑安装一个为 CUDA 11.5 编译的 PyTorch 版本。如何安装旧版本 解决方案&#xff1a; 决定不升级CUDA版本&#xff0c;而是使用一个与CUDA 11.5兼容的PyTorch版本&#xff0c;您可…

c#数据库: 10.调用存储过程查询信息,并显示在窗体上

查询女生信息&#xff0c;并将信息显示在窗体上: 原数据表//右键数据库名,新建查询 ------------- 新建查询窗口,添加新建存储过程Procedure_GetGirls1和查询代码如下 : CREATE PROCEDURE dbo.Procedure_GetGirls1 /*存储过程名称*/ AS SELECT * f…

【docker】Spring Boot3.x 打包 Docker容器

Docker化Spring Boot应用 创建文件夹 demo mkdir democd demo创建Dockerfile # 两个 openjdk 二选一 #FROM openjdk:17-jre-alpineFROM eclipse-temurin:17MAINTAINER chengxuyuanshitang <chengxuyuanshitangXX.com>RUN mkdir -p /workspace/java/demoCOPY demo.ja…

Python 与 TensorFlow2 生成式 AI(五)

原文&#xff1a;zh.annas-archive.org/md5/d06d282ea0d9c23c57f0ce31225acf76 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十二章&#xff1a;用生成式人工智能玩视频游戏&#xff1a;GAIL 在之前的章节中&#xff0c;我们已经看到如何使用生成式人工智能来生成…

LVGL自定义滑动

触摸和编码器都可以操作 typedef struct {lv_obj_t* obj;int16_t x;int16_t y;int16_t width;int16_t height; }pos_and_size_t;typedef struct {lv_obj_t* obj;lv_coord_t height;lv_coord_t width;lv_coord_t width_pad;lv_coord_t height_pad;lv_coord_t child_widget;lv_co…