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

news2024/11/19 21:26:22

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

一、布局

用到了一个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;
        }
    }
}

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

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

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

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

相关文章

用C实现通讯录(详细讲解+源码)

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL.. &#x1f4da;以后会将数据结构收录为一个系列&#xff0c;敬请期待 ● 本期内容会给大家带来通讯录的讲解&#xff0c;主要是利用结构体来实现通讯录&#xff0c;该通讯…

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

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

【35分钟掌握金融风控策略13】单维度策略监控和调优

目录 单维度策略监控和调优 策略宏观监控和调优 项目运营报表 资产监控报表 客群质量监控报表 资产使用报表 项目风险报表 FSTPD逾期报表 迁徙率报表 Vintage报表 贷后催收报表 单维度策略监控和调优 若贷前授信审批环节上线的是基于决策树开发的多维度策略&#x…

html+css 选择器优先级

1.基本选择器优先级 id>class>tagname(标签选择器)>*(通配符选择器) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>基本选择器的优先级</title><style type"text/css"…

微信小程序使用echarts实现条形统计图功能

微信小程序使用echarts组件实现条形统计图功能 使用echarts实现在微信小程序中统计图的功能&#xff0c;其实很简单&#xff0c;只需要简单的两步就可以实现啦&#xff0c;具体思路如下&#xff1a; 引入echarts组件调用相应的函数方法 由于需要引入echarts组件&#xff0c;代…

永磁同步电机PMSM负载状态估计simulink模型

永磁同步电机PMSM负载状态估计simulink模型&#xff0c;龙伯格观测器&#xff0c;各种卡尔曼滤波器&#xff0c;矢量控制&#xff0c;坐标变换&#xff0c;永磁同步电机负载转矩估计&#xff0c;pmsm负载转矩测量&#xff0c;负载预测&#xff0c;转矩预测的matlab/simulink仿真…

锂电池SOH预测 | 基于LSTM的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

BPE、Wordpiece、Unigram、SpanBERT等Tokenizer细节总结

BPE(Byte Pair Encoding) GPT-2和Roberta用的是这种&#xff0c;不会产生[UNK]这个unknown字符 这部分部分摘录自https://martinlwx.github.io/zh-cn/the-bpe-tokenizer/ 看以下code例子就足够理解了&#xff0c;核心是维护self.merges&#xff08;维护一个pair->str的字…

基于数据挖掘的斗鱼直播数据可视化分析系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 随着网络直播平台的兴起&#xff0c;斗鱼直播作为其中的佼佼者&#xff0c;吸引了大量用户和观众。为了更好地理解和分析斗鱼直播中的数据&#xff0c;本项目介绍了一个基于数据挖掘的斗鱼直播数据…

无人机GB42590接收端 +接收端模组,同时支持2.4G与5.8G双频

严格按照GB42590的协议开发的发射端&#xff0c;通过串口和模块通讯&#xff0c;默认波特率 921600。 http://www.doit.am/深圳四博智联科技有限公司https://shenzhendoit.taobao.com/category-1734422372.htm?spma1z10.1-c-s.0.0.560c74d77eT01G&searchy&catNameGB4…

MySQL数据库安装——zip压缩包形式

安装压缩包zip形式的 MySQL 8数据库 一 、先进入官网下载 https://dev.mysql.com/downloads/mysql/ 二、解压到某个文件夹 我解压到了D:\mysql\mysql8 下面 然后在这个文件夹下手动创建 my.ini 文件和 data 文件夹 my.ini 内容如下&#xff1a; 注意 basedir 和 datadi…

Docker数据管理、网络通信和Dockerfile

一.数据管理 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改操作立刻可见&#xff0c;并且更新数据不会影响镜像&#xff0c;从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于 Linux 下对目录…

面试算法题精讲:最长回文子串

面试算法题精讲&#xff1a;最长回文子串 题目来源&#xff1a;5. 最长回文子串 题目描述&#xff1a; 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 解法1&#xff1a;动态规划 对于…

ubuntu22.04安装TensorRT(过程记录)

重要说明&#xff1a;此贴经过多次修改。第一次安装的的为trt8.6.1版本。第二次安装的10.0.0.6版本。有些地方可能没改过来&#xff0c;比如链接向导&#xff0c;我懒得改了&#xff0c;但是流程是对的。 cuda和cudnn版本对应关系 tensorRT历史发行版本 CUDA历史发行版本 cudn…

【Godot4.2】有序和无序列表函数库 - myList

概述 在打印输出或其他地方可能需要构建有序或无序列表。本质就是构造和维护一个纯文本数组。并用格式化文本形式&#xff0c;输出带序号或前缀字符的多行文本。 为此我专门设计了一个类myList&#xff0c;来完成这项任务。 代码 以下是myList类的完整代码&#xff1a; # …

Android 设置头像 - 相册拍照

Android开发在个人信息管理中&#xff0c;如果设置头像&#xff0c;一般都提供了从相册选择和拍照两种方式。下午将针对设置用户头像相册和拍照两种方式的具体实现进行详细说明。 在实际实现过程中需要使用到权限管理&#xff0c;新版本的Android需要动态申请权限&#xff0c;权…

【JAVA】一文掌握Java并发编程

Java 开发中&#xff0c;并发编程属于相当重要的一个知识点&#xff0c;可以说&#xff0c;Java 的并发能力&#xff0c;是成就今日 Java 地位的因素之一。Java 的并发编程由浅入深实质上是包含 Java&#xff08;API&#xff09;层、JVM&#xff08;虚拟机&#xff09;层、内核…

Mac下使用homebrew管理多版本mysql同时启动

Mac下使用homebrew管理多版本mysql同时启动 思路 给每个版本分配不同的数据目录和配置文件即可 本文尝试了使用 brew 安装管理多个MySQL版本&#xff0c;同时运行、直接切换 安装 如果已有数据文件请自行备份以及使用 安装 mysql 5.7 brew install mysql5.7在 /opt/home…

运维笔记:基于阿里云跨地域服务器通信(上)

运维笔记 阿里云&#xff1a;跨地域服务器通信&#xff08;上&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

C语言编译的优化等级应该选哪个?O0、O1、O2还是O3

在使用IDE开发STM32程序时&#xff0c;IDE一般都会提供优化等级设置的选项&#xff0c;例如下图中KEIL软件优化等级的设置。 从上图中也可以看出&#xff0c;设置不同的优化等级&#xff0c;实际上是修改了编译器的编译参数。这个编译器是由ARM公司提供的C/C编译器armclang或者…