四、线段、矩形、圆、椭圆、自定义多边形、边缘轮廓和文本绘制(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); // BGR
    Cv2.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); // BGR
    Cv2.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); // BGR
    Cv2.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); // BGR

    Cv2.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); // BGR
            Cv2.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); // BGR
            Cv2.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); // BGR

            Cv2.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;
        }
    }
}

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dockerfile镜像构建实战

一、构建Apache镜像 cd /opt/ #建立工作目录 mkdir /opt/apache cd apache/vim Dockerfile #基于的基础镜像 FROM centos:7 #维护镜像的用户信息 MAINTAINER this is apache image <cyj> #镜像操作指令安装Apache软件 RUN yum install -y httpd #开启80端口 EXPOSE 80 #…

远程桌面连接不上个别服务器的问题分析与解决方案

在日常的IT运维工作中&#xff0c;远程桌面连接&#xff08;RDP&#xff0c;Remote Desktop Protocol&#xff09;是我们经常使用的工具之一&#xff0c;用于管理和维护远程服务器。然而&#xff0c;有时我们可能会遇到无法连接到个别服务器的情况。针对这一问题&#xff0c;我…

《Kafka 3.x.x 入门到精通》

Kafka 3.x.x 入门到精通 Kafka是一个由Scala和Java语言开发的&#xff0c;经典高吞吐量的分布式消息发布和订阅系统&#xff0c;也是大数据技术领域中用作数据交换的核心组件之一。以高吞吐&#xff0c;低延迟&#xff0c;高伸缩&#xff0c;高可靠性&#xff0c;高并发&#x…

【论文浅尝】Porting Large Language Models to Mobile Devices for Question Answering

Introduction 移动设备上的大型语言模型(LLM)增强了自然语言处理&#xff0c;并支持更直观的交互。这些模型支持高级虚拟助理、语言翻译、文本摘要或文本中关键术语的提取(命名实体提取)等应用。 LLMs的一个重要用例也是问答&#xff0c;它可以为大量的用户查询提供准确的和上…

LeetCode 热题 100 题解:二叉树部分(1 ~ 5)

题目一&#xff1a;二叉树的中序遍历&#xff08;No. 948&#xff09; 94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09; 题目难度&#xff1a;简单 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;roo…

【Django】初识Django快速上手

Django简介 Django是一个高级的、开源的Python Web框架&#xff0c;旨在快速、高效地开发高质量的Web应用程序 https://developer.mozilla.org/zh-CN/docs/Learn/Server-side/Django/Introduction 安装Django pip install Django如果要知道安装的Django的版本&#xff0c;可…

关于两步到位Chrome永久停止更新

全程就两个步骤&#xff01;&#xff01;敲重点&#xff01;&#xff01;&#xff01; 好使记得点赞关注我&#xff01; 1.找到Chrome包下的hosts文件 默认路径大概是 C:\Windows\System32\drivers\etc\hosts &#xff0c;不记得了可以通过Everything查找 在hosts 文件中 …

移动端日志采集与分析最佳实践

前言 做为一名移动端开发者&#xff0c;深刻体会日志采集对工程师来说具有重要意义&#xff0c;遇到问题除了 debug 调试就是看日志了&#xff0c;通过看日志可以帮助我们了解应用程序运行状况、优化用户体验、保障数据安全依据&#xff0c;本文将介绍日志采集的重要性、移动端…

开源博客项目Blog .NET Core源码学习(19:App.Hosting项目结构分析-7)

本文学习并分析App.Hosting项目中后台管理页面的主页面。如下图所示&#xff0c;开源博客项目的后台主页面采用layui预设类layui-icon-shrink-right设置样式&#xff0c;点击主页面中的菜单&#xff0c;其它页面采用弹框或者子页面形式显示在主页面的内容区域。   后台主页面…

JavaScript算法描述【排序与搜索】六大经典排序|合并两个有序数组|第一个错误的版本

&#x1f427;主页详情&#xff1a;Choice~的个人主页 &#x1f4e2;作者简介&#xff1a;&#x1f3c5;物联网领域创作者&#x1f3c5; and &#x1f3c5;阿里专家博主&#x1f3c5; and &#x1f3c5;华为云享专家&#x1f3c5; ✍️人生格言&#xff1a;最慢的步伐不是跬步&…

C++ 笔试练习笔记【1】:字符串中找出连续最长的数字串 OR59

文章目录 OR59 字符串中找出连续最长的数字串题目思路分析实现代码 注&#xff1a;本次练习题目出自牛客网 OR59 字符串中找出连续最长的数字串 题目思路分析 首先想到的是用双指针模拟&#xff0c;进行检索比较输出 以示例1为例&#xff1a; 1.首先i遍历str直到遍历到数字&a…

unity 专项一 localPosition与anchoredPosition(3D)的区别

一 、RectTransform 概念 1、RectTransform继承自Transform&#xff0c;用于描述矩形的坐标(Position)&#xff0c;尺寸(Size)&#xff0c;锚点(anchor)和中心点(pivot)等信息&#xff0c;每个2D布局下的元素都会自动生成该组件。 2、当我们在处理UI组件时&#xff0c;往往容易…

【微信小程序调用百度API实现图像识别实战】-前后端加强版

前言&#xff1a;基于前面两篇图像识别项目实战文章进行了改造升级。 第一篇 入门【微信小程序调用百度API实现图像识别功能】----项目实战 第二篇 前后端结合 【微信小程序调用百度API实现图像识别实战】----前后端分离 这一篇主要讲述的是在第二篇的基础上新增意见反馈功能&a…

ZooKeeper 搭建详细步骤之一(单机模式)

搭建模式简述 ZooKeeper 的搭建模式包括单机模式、集群模式和伪集群模式&#xff0c;分别适用于不同的场景和需求&#xff0c;从简单的单节点测试环境到复杂的多节点高可用生产环境。在实际部署时&#xff0c;应根据系统的可用性要求、数据量、并发负载等因素选择合适的部署模式…

mysql UNION 联合查询

mysql UNION 联合查询 业务需要拉数据&#xff0c;这里需要对查询不同格式的数据进行组装&#xff0c;此处采用联合查询 注意1&#xff1a;null as 设备关爱 &#xff0c;结果为null&#xff0c;表头为设备关爱 注意2&#xff1a; UNION 或者 UNION ALL 联合查询自行选用 注意3…

新开的拼多多店铺怎么运营

今天给大家分享一下如何在拼多多平台上开设并运营一家店铺。不管你是创业者还是小型商家&#xff0c;相信这个话题都会对你有所帮助。 拼多多新店需要做些推广提高店铺权重 新店用3an推客做推广比较好 3an推客是给商家提供的营销工具&#xff0c;3an推客CPS推广模式由商家自主…

Int4:Lucene 中的更多标量量化

作者&#xff1a;来自 Elastic Benjamin Trent, Thomas Veasey 在 Lucene 中引入 Int4 量化 在之前的博客中&#xff0c;我们全面介绍了 Lucene 中标量量化的实现。 我们还探索了两种具体的量化优化。 现在我们遇到了一个问题&#xff1a;int4 量化在 Lucene 中是如何工作的以…

(七)Servlet教程——Idea编辑器集成Tomcat

1. 点击桌面上Idea快捷方式打开Idea编辑器&#xff0c;假如没有创建项目的话打开Idea编辑器后的界面展示如下图所示 2. 点击界面左侧菜单中的自定义 3. 然后点击界面中的“所有设置...”,然后点击“构建、执行、部署”&#xff0c;选择其中的“应用程序服务器” 4. 点击“”按钮…

每日OJ题_DFS回溯剪枝⑦_力扣77. 组合

目录 力扣77. 组合 解析代码 力扣77. 组合 77. 组合 难度 中等 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,…

数据结构与算法(Java版) | 详解十大经典排序算法之一:插入排序

接下来&#xff0c;我来给大家讲解第三种排序算法&#xff0c;即插入排序。 基本介绍 首先&#xff0c;我们来看下插入排序的基本介绍。 插入排序&#xff0c;其属内部排序法&#xff0c;是对于欲排序的元素以插入的方式来找寻该元素的适当位置&#xff0c;以便最终达到排序…