四、线段、矩形、圆、椭圆、自定义多边形、边缘轮廓和文本绘制(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.rhkb.cn/news/317055.html

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

相关文章

如何有效的将丢失的mfc140u.dll修复,几种mfc140u.dll丢失的解决方法

当你在运行某个程序或应用程序时&#xff0c;突然遭遇到mfc140u.dll丢失的错误提示&#xff0c;这可能会对你的电脑运行产生一些不利影响。但是&#xff0c;不要担心&#xff0c;以下是一套详细的mfc140u.dll丢失的解决方法。 mfc140u.dll缺失问题的详细解决步骤 步骤1&#x…

VTK —— 二、教程五 - 通过鼠标事件与渲染交互(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功&#xff0c;若无VTK库则请先参考如下链接编译vtk源码&#xff1a; VTK —— 一、Windows10下编译VTK源码&#xff0c;并用Vs2017代码测试&#xff08;附编译流程、附编译好的库、vtk测试源码&#xff09; 教程描述 本…

C语言-嵌入式-STM32:FreeRTOS说明和详解

Free即免费的&#xff0c;RTOS的全称是Real time operating system&#xff0c;中文就是实时操作系统。 注意&#xff1a;RTOS不是指某一个确定的系统&#xff0c;而是指一类操作系统。比如&#xff1a;uc/OS&#xff0c;FreeRTOS&#xff0c;RTX&#xff0c;RT-Thread 等这些都…

Visual studio 2019 编程控制CH341A芯片的USB设备

1、硬件 买了个USB可转IIC、或SPI、或UART的设备&#xff0c;主芯片是CH341A 主要说明USB转SPI的应用&#xff0c;绿色跳线帽选择IIC&SPI&#xff0c;用到CS0、SCK、MOSI、MISO这4个引脚 2、软件 2.1、下载CH341A的驱动 点CH341A官网https://www.wch.cn/downloads/CH34…

2024最新版JavaScript逆向爬虫教程-------基础篇之常用的编码与加密介绍(python和js实现)

目录 一、编码与加密原理1.1 ASCII 编码1.2 详解 Base641.2.1 Base64 的编码过程和计算方法1.2.2 基于编码的反爬虫设计1.2.3 Python自带base64模块实现base64编码解码类封装 1.3 MD5消息摘要算法1.3.1 MD5 介绍1.3.2 Python实现md5以及其他常用消息摘要算法封装 1.4 对称加密与…

Qt中常用对话框

Qt中的对话框&#xff08;QDialog&#xff09;是用户交互的重要组件&#xff0c;用于向用户提供特定的信息、请求输入、或进行决策。Qt提供了多种标准对话框以及用于自定义对话框的类。以下将详细介绍几种常用对话框的基本使用、使用技巧以及注意事项&#xff0c;并附带C示例代…

小程序wx.getlocation接口如何开通?

小程序地理位置接口有什么功能&#xff1f; 随着小程序生态的发展&#xff0c;越来越多的小程序开发者会通过官方提供的自带接口来给用户提供便捷的服务。但是当涉及到地理位置接口时&#xff0c;却经常遇到申请驳回的问题&#xff0c;反复修改也无法通过&#xff0c;给的理由…

AI图书推荐:将 ChatGPT和Excel融合倍增工作效率

《将 ChatGPT和Excel融合倍增工作效率》&#xff08; Hands-on ChatGPT in Excel. Enhance Your Excel Workbooks&#xff09;由Mitja Martini撰写&#xff0c;旨在教授读者如何将ChatGPT与Excel结合使用&#xff0c;以提升工作效率和创造AI增强的Excel工具。它还提供了Excel中…

FineBI学习:K线图

效果图 底表结构&#xff1a;日期、股票代码、股票名称、开盘价、收盘价、最高价、最低价 步骤&#xff1a; 横轴&#xff1a;日期 纵轴&#xff1a;开盘价、最低价 选择【自定义图表】&#xff0c;或【瀑布图】 新建字段&#xff1a;价差&#xff08;收盘-开盘&#xf…

机器学习实战 —— 工业蒸汽量预测(二)

目录 文章描述背景描述数据说明数据来源实战内容2.数据特征工程2.1数据预处理和特征处理2.1.1 异常值分析2.1.2 归一化处理2.1.3 特征相关性 2.2 特征降维2.2.1 相关性初筛2.2.2 多重共线性分析2.2.3 PCA处理降维 文章描述 数据分析&#xff1a;查看变量间相关性以及找出关键变…

AcrelEMS-MH民航机场智慧能源管平台解决方案【可靠供电/降低能耗/高效运维】

民航机场行业背景 自2012年以来&#xff0c;我国民航运输规模出现了显著增长&#xff0c;旅客运输量&#xff1a;从2012年的3.19亿人次上升至2019年的6.6亿人次&#xff08;注&#xff1a;为剔除疫情影响&#xff0c;此处采取疫情前2019年的数据&#xff0c;下同&#xff09;&…

时间序列分析-无模型

本节内容介绍了无模型的时间序列分析方法&#xff0c;包括时间序列作趋势图、逐年分解、时间序列分解、直方图、ACF与PACF图&#xff0c;主要是作图。 首先导入数据和对应的库&#xff1a; import pandas as pd import numpy as np import matplotlib.pyplot as plt import se…

音视频入门基础:像素格式专题(1)——RGB简介

一、像素格式简介 像素格式&#xff08;pixel format&#xff09;指像素色彩按分量的大小和排列。这种格式以每个像素所使用的总位数以及用于存储像素色彩的红、绿、蓝和 alpha 分量的位数指定。在音视频领域&#xff0c;常用的像素格式包括RGB格式和YUV格式&#xff0c;本文…

记一次使用Notepad++正则表达式批量替换SQL语句

目录 一、需求二、解决方案三、正则解析 一、需求 存在如下SQL建表脚本&#xff1a; CREATE TABLE "BUSINESS_GOODS" ( "ID" VARCHAR(32) NOT NULL, "GOODS_CODE" VARCHAR(50), "GOODS_NAME" VARCHAR(100), ... NOT CLUSTER PRIMARY…

Flutter笔记:Widgets Easier组件库(2)阴影盒子

Flutter笔记 Widgets Easier组件库&#xff08;2&#xff09;&#xff1a;阴影盒子 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress o…

搭建大型分布式服务(三十七)SpringBoot 整合多个kafka数据源-取消限定符

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

基于 React 的图形验证码插件

react-captcha-code NPM 地址 &#xff1a; react-captcha-code - npm npm install react-captcha-code --save 如下我自己的封装&#xff1a; import Captcha from "react-captcha-code";type CaptchaType {captchaChange: (captchaInfo: string) > void;code…

Centos7+Hadoop3.3.4+KDC1.15+Ranger2.4.0集成

一、集群规划 本次测试采用3台虚拟机&#xff0c;操作系统版本为centos7.6。 kerberos采用默认YUM源安装&#xff0c;版本为&#xff1a;1.15.1-55 Ranger版本为2.4.0 系统用户为ranger:ranger IP地址主机名KDCRanger192.168.121.101node101.cc.localKDC masterRanger Admin…

关于下载上传的sheetjs

一、背景 需要讲后端返回来的表格数据通过前端设置导出其中某些字段&#xff0c;而且得是xlsx格式的。 那就考虑使用控件SheetJS。如果是几年前&#xff0c;一般来说&#xff0c;保存excel的文件都是后端去处理&#xff0c;处理完成给前端一个接口&#xff0c;前端调用了打开…

Java根据模板动态生成Pdf(添加页码、文件加密、Spire免费版本10页之后无法显示问题、嵌入图片添加公章、转Base64)

Java根据模板动态生成Pdf&#xff1a;添加页码、文件加密、Spire免费版本10页之后无法显示问题、嵌入图片添加公章、转Base64 引言【Java根据模板动态生成Pdf资源地址】示例一&#xff1a;动态生成带页码的PDF报告示例二&#xff1a;加密PDF以保护敏感信息示例三&#xff1a;应…