OpenCV绘图相关操作 C++

本文详细介绍了OpenCV中不同线条风格(FILLED, LINE_4, LINE_8, LINE_AA)的应用,涵盖了圆形、椭圆、直线、多边形、文本和箭头等图形绘制函数,并解读了字体风格和标记类型。通过实例演示了如何选择合适的线型、宽度和填充选项来增强图像表现力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

绘制相关知识

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

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值