绘制相关知识
lineType线条风格介绍
opencv的线条风格由枚举值描述:
enum LineTypes {
FILLED = -1,
LINE_4 = 4,
LINE_8 = 8,
LINE_AA = 16
};
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,
MARKER_TILTED_CROSS = 1,
MARKER_STAR = 2,
MARKER_DIAMOND = 3,
MARKER_SQUARE = 4,
MARKER_TRIANGLE_UP = 5,
MARKER_TRIANGLE_DOWN = 6
};
例子:
#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(使用前将#替换为@)