![323fd666235e62ddad1add88bb03b71a.png](https://i-blog.csdnimg.cn/blog_migrate/2fabd2758df3b071e4d9cdc975395227.jpeg)
1.8 绘制形状与文字
点Point()、颜色Scalar()、线line()、矩形rectangle()、椭圆ellipse()、圆circle()、多边形fillPoly()、随机数RNG、加文字putText()
1.8.1 使用点cv::Point与颜色cv::Scalar
(1)Point(点)表示二维2D平面上一个点(x, y),左上角为原点,x轴向左,y轴向下:
Point p;
p.x = 10;
p.y = 8;
或
Point p = Point(10,8);
Point p1 = Point(0, 30); //左上角为原点,x轴向左,y轴向下
Point p2;
p2.x = 720;
p2.y = 380;
(2)Scalar(颜色)表示四个元素的向量,通道颜色:
Scalar(a, b, c); // a = blue, b = green, c = red表示RGB三个通道(不声明也可以)
Scalar color = Scalar(0, 0, 255); //红色
1.8.2 绘制线、矩形、园、椭圆等基本几何形状
(1)画线 cv::line() 线类型 LINE_4LINE_8LINE_AA反锯齿(要渲染)
/*绘制直线实现函数*/
void MyLines() { //函数实现
Point p1 = Point(0, 30); //左上角为原点,x轴向左,y轴向下
Point p2;
p2.x = 720;
p2.y = 380;
Scalar color = Scalar(0, 0, 255); //红
line(bgImage, p1, p2, color, 1, LINE_AA); //原图,点1,点2,线颜色,线宽(值越大越宽),线类型
}
(2)画矩形 cv::rectangle()
/*绘制矩形实现函数 */
void MyRectangle() {
Rect rect = Rect(200, 100, 300, 300); //矩形范围,起始位置xy,宽,高
Scalar color = Scalar(255, 0, 255); //粉红
rectangle(bgImage, rect, color, 2, LINE_8); //原图,矩阵范围,线颜色,线宽,线类型
}
(3)画椭圆(弧) cv::ellipse()
/*绘制椭圆(弧)实现函数 */
void MyEllipse() {
Scalar color = Scalar(255, 255, 0); //青
ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows/ 8),80 ,0 ,270 ,color, 2, LINE_8);
//原图,椭圆中心,椭圆半径(长轴和短轴),倾斜角度,开始角度,结束角度,线颜色,线宽,线类型
}
(4)画圆 cv::circle()
/*绘制圆实现函数 */
void MyCircle() {
Scalar color = Scalar(0,255, 255); //黄
Point center = Point(bgImage.cols / 2, bgImage.rows / 2); //圆心
circle(bgImage, center, 50, color, 3, 8); //原图,圆心,半径长度,线颜色,thickness(正值代表圆线宽,负值代表填充圆),线类型
}
(5)画多边形填充 cv::fillPoly()
/*多边形填充实现函数 */
void MyPolygon() {
Point pts[1][6]; //多个点,二维数组
pts[0][0] = Point(100, 100); //5边形,6个点,能形成封闭区域
pts[0][1] = Point(100, 200);
pts[0][2] = Point(150, 250);
pts[0][3] = Point(200, 200);
pts[0][4] = Point(200, 100);
pts[0][5] = Point(100, 100);
const Point* ppts[] = { pts[0] }; //指针
int npt[] = { 6 }; //多少个
Scalar color = Scalar(255, 0, 0); //白
fillPoly(bgImage, ppts, npt, 1, color, 8); //原图,多个点指针,几个点连线,线宽,线颜色,线类型
}
1.8.3 随机数生成cv::RNG
生成高斯随机数gaussian (double sigma)
生成均匀分布随机数uniform (int a, int b)
画随机线:
/*绘制随机线*/
void RandomLineDemo() {
RNG rng(12345); //随机数生成函数
Point pt1; // 线的位置两点
Point pt2;
Mat bg = Mat::zeros(bgImage.size(), bgImage.type()); // 空白图像全黑背景
for (int i = 0; i < 100000; i++) {
pt1.x = rng.uniform(0, bgImage.cols); //点随机规格,生成正态分布随机数,不超过范围
pt2.x = rng.uniform(0, bgImage.cols);
pt1.y = rng.uniform(0, bgImage.rows);
pt2.y = rng.uniform(0, bgImage.rows);
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); //随机颜色
if (waitKey(50) > 0) { //等待x ms,如果在此期间有按键按下,则立即结束并返回按下按键的ASCII码,否则没有按键返回 -1
break; // 跳出for循环
}
line(bg, pt1, pt2, color, 1, 8); // 划线
imshow("random line demo",bg);
}
}
1.8.4 绘制添加文字
putText函数 中设置fontFace(cv::HersheyFonts),
- fontFace, CV_FONT_HERSHEY_PLAIN 字体
- fontScale , 1.0, 2.0~ 8.0 字号
putText(bgImage, "Hello OpenCV", Point(250, 300), CV_FONT_HERSHEY_COMPLEX, 1.5, Scalar(255, 255, 255), 2, LINE_AA);
//原图,字符串,中心,字体,字号,线颜色,线宽,线类型
完整程序:
/*1.8 绘制形状与文字*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv; //使用cv命名空间,下面的cv::line等的前缀可以不写
Mat bgImage;
const char* drawdemo_win = "draw shapes and text demo";
void MyLines(); //函数声明
void MyRectangle();
void MyEllipse();
void MyCircle();
void MyPolygon();
void RandomLineDemo();
int main(int argc, char** argv) { //argc 表示命令行输入参数的个数(以空白符分隔),argv中存储了所有的命令行参数
bgImage = imread("E:/OpenCV/testimage/test5.jpg");
if (bgImage.empty()) {
printf("could not load image...n");
return -1;
}
MyLines(); //函数调用
MyRectangle();
MyEllipse();
MyCircle();
MyPolygon();
RandomLineDemo();
putText(bgImage, "Hello OpenCV", Point(250, 300), CV_FONT_HERSHEY_COMPLEX, 1.5, Scalar(255, 255, 255), 2, LINE_AA);
//原图,字符串,中心,字体,字号,线颜色,线宽,线类型
namedWindow("test opencv setup", CV_WINDOW_AUTOSIZE);
imshow("test opencv setup", bgImage);
waitKey(0); //x=0无限等待下去,直到有按键按下
return 0;
}
/*绘制直线*/
void MyLines() { //函数实现
Point p1 = Point(0, 30); //左上角为原点,x轴向左,y轴向下
Point p2;
p2.x = 720;
p2.y = 380;
Scalar color = Scalar(0, 0, 255); //红
line(bgImage, p1, p2, color, 1, LINE_AA); //原图,点1,点2,线颜色,线宽(值越大越宽),线类型
}
/*绘制矩形*/
void MyRectangle() {
Rect rect = Rect(200, 100, 300, 300); //矩形范围,起始位置xy,宽,高
Scalar color = Scalar(255, 0, 255); //粉红
rectangle(bgImage, rect, color, 2, LINE_8); //原图,矩阵范围,线颜色,线宽,线类型
}
/*绘制椭圆(弧)*/
void MyEllipse() {
Scalar color = Scalar(255, 255, 0); //青
ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows/ 8),80 ,0 ,270 ,color, 2, LINE_8); //原图,椭圆中心,椭圆半径(长轴和短轴),倾斜角度,开始角度,结束角度,线颜色,线宽,线类型
}
/*绘制圆*/
void MyCircle() {
Scalar color = Scalar(0,255, 255); //黄
Point center = Point(bgImage.cols / 2, bgImage.rows / 2); //圆心
circle(bgImage, center, 50, color, 3, 8); //原图,圆心,半径长度,线颜色,线宽,线类型
}
/*多边形填充*/
void MyPolygon() {
Point pts[1][6]; //多个点,二维数组
pts[0][0] = Point(100, 100); //5边形,6个点,能形成封闭区域
pts[0][1] = Point(100, 200);
pts[0][2] = Point(150, 250);
pts[0][3] = Point(200, 200);
pts[0][4] = Point(200, 100);
pts[0][5] = Point(100, 100);
const Point* ppts[] = { pts[0] }; //指针
int npt[] = { 6 }; //多少个
Scalar color = Scalar(255, 0, 0); //白
fillPoly(bgImage, ppts, npt, 1, color, 8); //原图,多个点指针,几个点连线,线宽,线颜色,线类型
}
/*绘制随机线*/
void RandomLineDemo() {
RNG rng(12345); //随机数生成函数
Point pt1; // 线的位置两点
Point pt2;
Mat bg = Mat::zeros(bgImage.size(), bgImage.type()); // 空白图像全黑背景
for (int i = 0; i < 100000; i++) {
pt1.x = rng.uniform(0, bgImage.cols); //点随机规格,生成正态分布随机数,不超过范围
pt2.x = rng.uniform(0, bgImage.cols);
pt1.y = rng.uniform(0, bgImage.rows);
pt2.y = rng.uniform(0, bgImage.rows);
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); //随机颜色
if (waitKey(50)>0){ //等待xms,如果在此期间有按键按下,则立即结束并返回按下按键的ASCII码,否则没有按键返回-1
break; // 跳出for循环
}
line(bg, pt1, pt2, color, 1, 8); // 划线
imshow("random line demo",bg);
}
}
运行结果:
![e1a84e417e5dc6f9d778d18a8bfdb6f0.png](https://i-blog.csdnimg.cn/blog_migrate/0f138422d897d03180130566f303092e.jpeg)