OpenCV绘图相关操作 C++

2023-05-16

绘制相关知识

lineType线条风格介绍
opencv的线条风格由枚举值描述:

//! type of line
enum LineTypes {
    FILLED  = -1,
    LINE_4  = 4, //!< 4-connected line
    LINE_8  = 8, //!< 8-connected line
    LINE_AA = 16 //!< antialiased line
};

FILLED = -1 非线条风格,对于绘制封闭图像,将thickness参数置为-1,即为颜色填充。
LINE_4 = 4 基于4邻域连接Bresenham算法处理的直线。
效果:
在这里插入图片描述
LINE_8 = 8 基于4邻域连接Bresenham算法处理的直线。
效果:
在这里插入图片描述
LINE_AA = 16 基于高斯滤波平滑处理的直线。
效果:
在这里插入图片描述

绘制相关函数

绘制圆形
函数原型:

void circle(InputOutputArray img, Point center, int radius,
                       const Scalar& color, int thickness = 1,
                       int lineType = LINE_8, int shift = 0);

img是输入图像;center是绘制圆的圆心;radius是绘制圆的半径;color是绘制的颜色;thickness是绘制的线宽;lineType是绘制的线条风格;shift偏移量。

绘制椭圆
函数原型1:

void ellipse(InputOutputArray img, Point center, Size axes,
                        double angle, double startAngle, double endAngle,
                        const Scalar& color, int thickness = 1,
                        int lineType = LINE_8, int shift = 0);

img是输入图像;color是绘制的颜色;thickness是绘制的线宽;lineType是绘制的线条风格;shift偏移量;其余参数用于描述要绘制的椭圆。
在这里插入图片描述

函数原型2:

void ellipse(InputOutputArray img, const RotatedRect& box, const Scalar& color,
                        int thickness = 1, int lineType = LINE_8);

img是输入图像;color是绘制的颜色;thickness是绘制的线宽;lineType是绘制的线条风格;shift偏移量;其余参数用于描述要绘制的椭圆。
在这里插入图片描述
绘制直线
函数原型:

void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
                     int thickness = 1, int lineType = LINE_8, int shift = 0);

img是输入图像;pt1是直线的一个端点;pt2是直线的另一个端点;color是绘制的颜色;thickness是绘制的线宽;lineType是绘制的线条风格;shift偏移量。
在这里插入图片描述
绘制多重折线
函数原型1:

void polylines(InputOutputArray img, InputArrayOfArrays pts,
                            bool isClosed, const Scalar& color,
                            int thickness = 1, int lineType = LINE_8, int shift = 0 );

函数原型2:

void polylines(InputOutputArray img, const Point* const* pts, const int* npts,
                          int ncontours, bool isClosed, const Scalar& color,
                          int thickness = 1, int lineType = LINE_8, int shift = 0 );

这两个函数仅仅是函数风格不同,这里仅考虑函数1。
img是输入图像;pts是输入的点集;isClosed标志表明点集是否封闭;color是绘制的颜色;thickness是绘制的线宽;lineType是绘制的线条风格;shift偏移量。
在这里插入图片描述
绘制矩形
函数原型1:

void rectangle(InputOutputArray img, Point pt1, Point pt2,
                          const Scalar& color, int thickness = 1,
                          int lineType = LINE_8, int shift = 0);

函数原型2:

void rectangle(InputOutputArray img, Rect rec,
                          const Scalar& color, int thickness = 1,
                          int lineType = LINE_8, int shift = 0);

这两个函数仅仅是描述矩形的方式不同,这里仅考虑函数1。
img是输入图像;pt1是矩形的左上角点;pt2是矩形的右下角点;color是绘制的颜色;thickness是绘制的线宽;lineType是绘制的线条风格;shift偏移量。
在这里插入图片描述
绘制填充的简单多边形
函数原型1:

void fillConvexPoly(InputOutputArray img, InputArray points,
                                 const Scalar& color, int lineType = LINE_8,
                                 int shift = 0);

函数原型2:

void fillConvexPoly(InputOutputArray img, const Point* pts, int npts,
                               const Scalar& color, int lineType = LINE_8,
                               int shift = 0);

这两个函数仅仅是函数风格不同,这里仅考虑函数1。
img是输入图像;points是输入的点集;color是绘制的颜色;thickness是绘制的线宽;lineType是绘制的线条风格;shift偏移量。
在这里插入图片描述
绘制文本
函数原型:

void putText( InputOutputArray img, const String& text, Point org,
                         int fontFace, double fontScale, Scalar color,
                         int thickness = 1, int lineType = LINE_8,
                         bool bottomLeftOrigin = false );

img是输入图像;text为要绘制的文本;org是绘制文本的基准点;fontFace是绘制文本的文字风格;fontScale是绘制文本缩放因子;color是绘制的颜色;thickness是绘制的线宽;lineType是绘制的线条风格;bottomLeftOrigin标志,表示文本与文本基准点的关系。
字体风格 fontFace说明
其是一堆枚举值:

enum HersheyFonts {
    FONT_HERSHEY_SIMPLEX        = 0, //!< normal size sans-serif font
    FONT_HERSHEY_PLAIN          = 1, //!< small size sans-serif font
    FONT_HERSHEY_DUPLEX         = 2, //!< normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
    FONT_HERSHEY_COMPLEX        = 3, //!< normal size serif font
    FONT_HERSHEY_TRIPLEX        = 4, //!< normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
    FONT_HERSHEY_COMPLEX_SMALL  = 5, //!< smaller version of FONT_HERSHEY_COMPLEX
    FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< hand-writing style font
    FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
    FONT_ITALIC                 = 16 //!< flag for italic font
};

效果一览:
在这里插入图片描述
bottomLeftOrigin标志说明
取值为true,则org指定的点为插入文字的左上角位置。
取值为false,则org指定的点为插入文字的左下角位置。
在这里插入图片描述

获取文字区域的尺寸 getTextSize()
利用这个函数可以协助判断绘制的文字在图片显示区域内。
函数原型:

Size getTextSize(const String& text, int fontFace,
                            double fontScale, int thickness,
                            CV_OUT int* baseLine);

例子:

#include <iostream>
#include <vector>
#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

int main() {
	Mat src = Mat::zeros(Size(400, 400), CV_8UC3);

	string text = "hello";
	int fontFace = FONT_HERSHEY_SIMPLEX;
	double fontScale = 1.0;
	int thickness = 2;
	Point org(50, 100);
	int lineType = LINE_8;
	bool bottomLeftOrigin = true;

	putText(src, text, org, fontFace, fontScale, Scalar(0, 255, 0), thickness, lineType, bottomLeftOrigin);

	int baseLine;
	Size size = getTextSize(text, fontFace, fontScale, thickness,&baseLine);

	cout << "baseLine = " << baseLine << endl;
	cout << size << endl;

	imshow("src", src);
	waitKey();

	return 0;
}

输出:
baseLine = 10
[74 x 22]

绘制箭头线段
函数原型:

void arrowedLine(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,int thickness=1, int line_type=8, int shift=0, double tipLength=0.1);

img是输入图像;pt1是箭头线段的起始点;pt2是箭头线段的终点;color是绘制的颜色;thickness是绘制的线宽;line_type是绘制的线条风格;shift是偏移量;tipLength是箭头长度和整个箭头线段的长度比例。

绘制各种标记
函数原型:

void drawMarker(InputOutputArray img, Point position, const Scalar& color,
                             int markerType = MARKER_CROSS, int markerSize=20, int thickness=1,
                             int line_type=8);

img是输入图像;position是标记的原点;color是绘制的颜色;markerType是标记的种类;markerSize是标记的大小;thickness是绘制的线宽;line_type是绘制的线条风格。

标记种类的说明
有如下种类:

enum MarkerTypes
{
    MARKER_CROSS = 0,           //!< A crosshair marker shape
    MARKER_TILTED_CROSS = 1,    //!< A 45 degree tilted crosshair marker shape
    MARKER_STAR = 2,            //!< A star marker shape, combination of cross and tilted cross
    MARKER_DIAMOND = 3,         //!< A diamond marker shape
    MARKER_SQUARE = 4,          //!< A square marker shape
    MARKER_TRIANGLE_UP = 5,     //!< An upwards pointing triangle marker shape
    MARKER_TRIANGLE_DOWN = 6    //!< A downwards pointing triangle marker shape
};

例子:

#include <opencv2/opencv.hpp>

int main() {
	cv::Mat img = cv::Mat::zeros(240, 240, CV_8UC3);

	cv::drawMarker(img, cv::Point(30, 30), cv::Scalar(0, 255, 0), cv::MarkerTypes::MARKER_CROSS);  //十字标记
	cv::drawMarker(img, cv::Point(60, 60), cv::Scalar(0, 0, 255), cv::MarkerTypes::MARKER_TILTED_CROSS);  //斜十字标记
	cv::drawMarker(img, cv::Point(90, 90), cv::Scalar(255, 0, 0), cv::MarkerTypes::MARKER_STAR);  //米字标记
	cv::drawMarker(img, cv::Point(120, 120), cv::Scalar(0, 255, 255), cv::MarkerTypes::MARKER_DIAMOND);  //菱形标记
	cv::drawMarker(img, cv::Point(150, 150), cv::Scalar(255, 255, 0), cv::MarkerTypes::MARKER_SQUARE);  //正方形标记
	cv::drawMarker(img, cv::Point(180, 180), cv::Scalar(255, 0, 255), cv::MarkerTypes::MARKER_TRIANGLE_UP);  //上三角标记
	cv::drawMarker(img, cv::Point(210, 210), cv::Scalar(0, 255, 0), cv::MarkerTypes::MARKER_TRIANGLE_DOWN);  //下三角标记
	cv::imshow("drawMarker", img);
	cv::waitKey();

	cv::destroyAllWindows();
	return 0;
}

效果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV绘图相关操作 C++ 的相关文章

  • C++中的Lambda函数

    Lambda函数也叫匿名函数 xff0c 是自定义函数的一种 专指用关键字 lambda 定义的无名短函数 xff0c 所以也有Lambda表达式这种说法 这种函数得名于省略了用def声明函数的标准步骤 xff0c 是C 43 43 11中
  • go语言判断文件是否为UTF8编码

    一 思路 xff1a 1 UTF8编码规则 xff1a 对于单字节字符 xff0c 8个比特位最高位为0 对于多字节字符 xff0c 若字符由n个字节组成 xff0c 则第一个字节8个比特中最高n位都是1 xff0c 剩下n 1字节中最高位
  • qtcreator调试经常断点导致卡死问题解决

    一 问题描述 在qt开发中 xff0c 使用debuging进行调试 xff08 点击下面按钮 xff09 总会出现 xff0c 软件运行还好 xff0c 就是运行到断点的时候 xff0c 软件一直在等待卡死 在windows上面没有遇到过
  • python+opencv读取摄像头并显示

    解释看注释 xff0c 直接上代码 xff01 span class token keyword import span cv2 span class token comment 打开本地摄像头 span cap span class to
  • python+opencv拉流(串流)

    解释看注释 xff0c 直接上代码 xff01 span class token keyword import span cv2 span class token comment 流链接 span url span class token
  • python+opencv做一个视频录制器(mp4)

    1 功能说明 代码的功能就是读取摄像头视频显示 xff0c 并同时保存为mp4文件 xff0c 示例代码为1小时保存一个视频 2 代码 解释看注释 xff0c 直接上代码 xff01 span class token keyword imp
  • [Python] Pandas 中 read_csv 与 read_hdf 速度对比

    1 read csv VS read hdf 一般情况下 我们习惯使用 Pandas 中的 read csv 函数来读取 CSV 文件 但当 CSV 文件比较大时 read csv 的速度会显得有点慢 这时可以考虑使用 HDF5 格式来存储
  • inode节点(详解)

    首先 xff0c 要明确理解inode是理解Linux Unix文件系统和硬盘存储的基础 1 什么是inode xff1f 理解inode xff0c 要从文件存储说起 文件存储在硬盘上 xff0c 硬盘的最小存储单位叫做 扇区 每个扇区能
  • 8b/10b编码技术系列(一):Serdes、CDR、K码

    和大家分享一下关于8b 10b编码的知识点 xff0c 如有什么错误之处或大家有什么额外的见解欢迎大家公众号后台留言 xff01 一 Serdes高速收发器 在传统的源同步传输中 xff0c 数据和时钟分离 xff0c 在速率较低 lt 1
  • Java处理文件时常用的文件类型及对应的contentType

    2023 3 02 项目管理系统中对项目文档的处理 本来全部设置的是二进制流 xff0c 发现下载后没有文件类型和文件名称 对应的解决办法 xff1a 上传 下载的时候对文件类型进行说明 上传 span class token keywor
  • 51单片机入门-点亮第一个LED灯

    前期准备 keil软件的安装 可以参考我的另一篇文章 https blog csdn net weixin 42911200 article details 81590158 安装烧录软件和添加单片机 由于笔者所用的芯片为STC89C52
  • 基于Docker的容器集群调度机制的设计与实现

    本文来自于北京邮电大学2018年硕士论文的整理 xff0c 作者李战 论文主要分为如下四部分 一 集群调度架构总结 1 xff09 中央式架构 最原始 xff0c k8s xff0c swarm均是该调度方式 由于所有任务都由唯一的调度器处
  • Linux版的Mysql基本操作命令整理

    1 更改密码 SET PASSWORD 61 PASSWORD 39 123456 39 ALTER USER 39 root 39 64 39 localhost 39 PASSWORD EXPIRE NEVER flush privil
  • 关于MySQL5.7 密码策略/审计日志开启详细步骤

    一 配置密码策略 登录mysql xff1a mysql u root p 输入密码 xff1a xxxxxx xff08 以实际情况为例 xff0c 例如 xff1a 123456 xff09 目标密码策略 xff1a 至少一个大写 至少
  • 软件测试的基本理论-黑盒测试-1

    黑盒测试方法 一 黑盒测试方法1 xff0c 等价类划分法a 等价类划分概述等价类划分 b xff1a 设计测试用例等价类划分demo 2 边界值分析法边界值分析法概述边界值分析法demo 3 因果图方法因果图设计方法因果图设计demo 4
  • Python二维插值(scipy.interpolate.interp2d)注意输入参数维度问题

    问题描述 SGLI将数据的经纬度进行了重采样 xff0c 例如本来是10001000的图像重采样到了100100像元 xff0c 这导致在对影像插值时需要先把经 纬度重采样到1000 1000 xff0c 本文主要记录在重采样中遇到的输入数
  • 深度学习传统CV算法——边缘检测算法综述

    边缘检测 边缘概述认识边缘定义轮廓和边缘的关系边缘的类型 边缘检测的概念概念 边缘检测方法基本方法图像滤波图像增强图像检测图像定位 边缘检测算子的概念常见的边缘检测算子用梯度算子实现边缘检测的原理梯度算子边缘点梯度梯度算子 梯度如何衡量使用
  • Linux网络工具简介

    Linux网络工具简介 学习计算机网络不能只学习理论知识 xff0c 同时必须学会网络工具的使用 xff0c 用网络工具来快速判断自己程序的网络状态并发现问题 第一次使用网络工具前需要先下载安装 xff1a 安装网络工具包net tools
  • “操作无法完成,因为文件已在另一个程序中打开”怎么办?

    Step1 xff1a 通过报错 xff0c 找到进程名称 可以找到文件夹内的具体文件 Step2 xff1a 打开任务管理器 ctrl 43 alt 43 del 点击性能 Step3 xff1a 打开资源监视器 Step4 点击CPU
  • 将Mircrosoft Store下载的Ubuntu安装到指定位置方法,同时解决“你需要来自System的权限才能对此文件进行更改”问题

    一 概述 最近使用到WIndows的WSL功能 xff0c 需要安装ubuntu这个子系统进行仿真环境搭建 xff0c 但是又不愿意使用虚拟机 xff0c 不太方便 在安装过程中发现本身就岌岌可危的C盘经常突然爆满 xff0c 经过检查发现

随机推荐