OpenCV 图像几何形状绘制
一、知识点
1、在屏幕、图像上,一般坐标系原点(0,0)在左上角,向右x轴正方向,向下y轴正方向。
|--------------> +x
|
|
|
|
V
+y
2、void rectangle(InputOutputArray img, Rect rec, const Scalar & color, int thickness = 1, int lineType = LINE_8, int shift = 0);
(1)、在图像上绘制或填充一个矩形。
(2)、参数说明:
img: 输入、输出参数,表示要绘制或填充矩形的图像。
rec: 定义了矩形左上角位置、宽、高。
color: 矩形线框或填充的颜色。
thickness: >0时表示矩形线框粗细,<0时表示填充矩形。
lineType: 线条的类型,如8连通、4连通、抗锯齿等。
shift: 点坐标中的小数位数。
3、void circle(InputOutputArray img, Point center, int radius, const Scalar & color, int thickness = 1, int lineType = LINE_8, int shift = 0);
(1)、在图像上绘制或填充一个圆形。
(2)、参数说明:
img: 输入、输出参数,表示要绘制或填充圆形的图像。
center: 圆心位置。
radius: 圆形半径。
color: 圆形线框或填充的颜色。
thickness: >0时表示圆形线框粗细,<0时表示填充圆形。
lineType: 线条的类型,如8连通、4连通、抗锯齿等。
shift: 点坐标中的小数位数。
4、void line(InputOutputArray img, Point pt1, Point pt2, const Scalar & color, int thickness = 1, int lineType = LINE_8, int shift = 0);
(1)、在图像上绘制一个线段。
(2)、参数说明:
img: 输入、输出参数,表示要绘制线段的图像。
pt1: 线段的第一个点位置。
pt2: 线段的第二个点位置。
color: 线段的颜色。
thickness: 线段的粗细。
lineType: 线条的类型,如8连通、4连通、抗锯齿等。
shift: 点坐标中的小数位数。
5、void ellipse(InputOutputArray img, const RotatedRect & box, const Scalar & color, int thickness = 1, int lineType = LINE_8);
(1)、在图像上绘制或填充一个椭圆。
(2)、参数说明:
img: 输入、输出参数,表示要绘制或填充椭圆的图像。
box: 一个RotatedRect对象,它包含椭圆的中心位置、大小(长轴和短轴的长度)、旋转角度(椭圆主轴与水平方向的夹角,单位是度,顺时针为正),即函数要绘制旋转矩形内接的椭圆。
color: 椭圆线框或填充的颜色。
thickness: >0时表示椭圆线框粗细,<0时表示填充椭圆。
lineType: 线条的类型,如8连通、4连通、抗锯齿等。
6、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);
(1)、在图像上绘制或填充一个圆弧。
(2)、参数说明:
img: 输入、输出参数,表示要绘制或填充圆弧的图像。
center: 圆弧所在的椭圆的中心位置。
axes: 圆弧所在的椭圆的长半轴、短半轴的长度。
angle: 圆弧所在的椭圆的旋转角度(椭圆主轴与水平方向的夹角,单位是度,顺时针为正)。
startAngle: 圆弧起始角度(与主轴的夹角,单位是度,顺时针为正)。
endAngle: 圆弧终止角度(与主轴的夹角,单位是度,顺时针为正)。
color: 圆弧线框或填充的颜色。
thickness: >0时表示圆弧线框粗细,<0时表示填充圆弧扇区。
lineType: 线条的类型,如8连通、4连通、抗锯齿等。
shift: 点坐标中的小数位数。
二、示例代码
#include <iostream>
#include <opencv2/opencv.hpp>int main()
{cv::Mat src = cv::imread("../images/9.png");if (src.empty()){std::cout << "load src image error..." << std::endl;return -1;}cv::imshow("原图演示", src);//在图像上绘制一个红色矩形cv::rectangle(src, cv::Rect(240, 10, 270, 220), cv::Scalar(0, 0, 255), 2, 8, 0);//在图像上填充一个红色矩形cv::rectangle(src, cv::Rect(520, 10, 50, 220), cv::Scalar(0, 0, 255), -1, 8, 0);//在图像上绘制一个蓝色圆形cv::circle(src, cv::Point(570, 230), 10, cv::Scalar(255, 0, 0), 2, 8, 0);//在图像上填充一个蓝色圆形cv::circle(src, cv::Point(570, 10), 10, cv::Scalar(255, 0, 0), -1, 8, 0);//在图像上绘制一条线段cv::line(src, cv::Point(520, 10), cv::Point(570, 230), cv::Scalar(0, 255, 0), 2, 8, 0);//在图像上绘制一条反锯齿线段cv::line(src, cv::Point(570, 10), cv::Point(520, 230), cv::Scalar(0, 255, 0), 2, cv::LINE_AA, 0);//绘制椭圆cv::RotatedRect rrt;rrt.center = cv::Point(200, 200);rrt.size = cv::Size(200, 100);rrt.angle = 30.0;cv::ellipse(src, rrt, cv::Scalar(0, 255, 255), 2, 8);//绘制圆弧cv::ellipse(src, cv::Point(200, 200), cv::Size(100, 50), 30, 30, 150, cv::Scalar(255, 0, 255), 2, 8, 0);//填充圆弧cv::ellipse(src, cv::Point(200, 200), cv::Size(100, 50), 30, -30, -150, cv::Scalar(255, 0, 255), -1, 8, 0);cv::imshow("绘制演示", src);cv::waitKey(0);return 0;
}
输出结果: