相关知识:
API:
画线:
line(CV_IN_OUT Mat& img, Point pt1, Point pt2, const Scalar& color,int thickness=1, int lineType=8, int shift=0);
画矩形:
rectangle(CV_IN_OUT Mat& img, Point pt1, Point pt2,const Scalar& color, int thickness=1, int lineType=8, int shift=0);
画圆:
circle(CV_IN_OUT Mat& img, Point center, int radius, const Scalar& color, int thickness=1,int lineType=8, int shift=0);
画椭圆:
ellipse(CV_IN_OUT Mat& img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness=1, int lineType=8, int shift=0);
画多边形/折线:
polylines(Mat& img, const Point** pts, const int* npts, int ncontours, bool isClosed, const Scalar& color, int thickness=1, int lineType=8, int shift=0 );
注释: //img:在img表示的图像上绘制
//pts:是指向多边形数组的指针,必须是const修饰的
// npts:是多边形顶点个数的数组名
// ncontours:绘制多边形的个数
// isClosed:表示多边形是否闭合,1表示闭合,0表示不闭合
// color:是填充的颜色
画填充多边形:
fillPoly(Mat& img, const Point** pts, const int* npts, int ncontours, const Scalar& color, int lineType=8, int shift=0, Point offset=Point() );
画-添加文本:
putText( Mat& img, const string& text, Point org,int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false );
相关程序
#include <stdafx.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
//全局变量
const int NUMBER = 80;
const int DELAY = 5; //静态变量
const int window_width = 900;
const int window_height = 600;//静态变量
int x_1 = -window_width / 2;
int x_2 = window_width * 3 / 2;
int y_1 = -window_width / 2;
int y_2 = window_width * 3 / 2;
//函数头声明
static Scalar randomColor(RNG& rng);
int Drawing_Random_Lines(Mat image, char* window_name, RNG rng);
int Drawing_Random_Rectangles(Mat image, char* window_name, RNG rng);
int Drawing_Random_Ellipses(Mat image, char* window_name, RNG rng);
int Drawing_Random_Polylines(Mat image, char* window_name, RNG rng);
int Drawing_Random_Filled_Polygons(Mat image, char* window_name, RNG rng);
int Drawing_Random_Circles(Mat image, char* window_name, RNG rng);
int Displaying_Random_Text(Mat image, char* window_name, RNG rng);
int Displaying_Big_End(Mat image, char* window_name, RNG rng);
/**
* @function main
*/
int main(int argc, char** argv)
{
int c;
//创建一个窗口
char window_name[] = "Drawing_2 Tutorial";
//创建一个随机对象rng
RNG rng(0xFFFFFFFF);
//用零初始化矩阵,即窗口背景为黑色
Mat image = Mat::zeros(window_height, window_width, CV_8UC3);
//在窗口显示并延时
imshow(window_name, image);
waitKey(DELAY);
//===开始画图===
//先画一些线条
c = Drawing_Random_Lines(image, window_name, rng);
if (c != 0) return 0;
//再画一个矩形
c = Drawing_Random_Rectangles(image, window_name, rng);
if (c != 0) return 0;
//画一些椭圆
c = Drawing_Random_Ellipses(image, window_name, rng);
if (c != 0) return 0;
//现在画一些折线
c = Drawing_Random_Polylines(image, window_name, rng);
if (c != 0) return 0;
//画填充多边形
c = Drawing_Random_Filled_Polygons(image, window_name, rng);
if (c != 0) return 0;
//画圆
c = Drawing_Random_Circles(image, window_name, rng);
if (c != 0) return 0;
//在随机位置显示文本
c = Displaying_Random_Text(image, window_name, rng);
if (c != 0) return 0;
//显示结束
c = Displaying_Big_End(image, window_name, rng);
if (c != 0) return 0;
waitKey(0);
return 0;
}
//函数定义
/**
* @function randomColor
* @brief Produces a random color given a random object
*/
static Scalar randomColor(RNG& rng)
{
int icolor = (unsigned)rng;
//Scalar函数里面的三个参数对应R,G,B
return Scalar(icolor & 255, (icolor >> 8) & 255, (icolor >> 16) & 255); //icolor和255与运算
//return Scalar(rng.uniform(0, 255),rng.uniform(0, 255), rng.uniform(0, 255));
}
/**
* @function Drawing_Random_Lines
*/
int Drawing_Random_Lines(Mat image, char* window_name, RNG rng)
{
int lineType = 8;
Point pt1, pt2;
for (int i = 0; i < NUMBER; i++)
{
//rng.unifor(a,b)在即在闭区间[a,b]内随机分配一个数值
pt1.x = rng.uniform(x_1, x_2);
pt1.y = rng.uniform(y_1, y_2);
pt2.x = rng.uniform(x_1, x_2);
pt2.y = rng.uniform(y_1, y_2);
//randomColor(rng)随机为rng分配一种颜色
line(image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8);
imshow(window_name, image);
//延时等待循环
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Drawing_Rectangles
*/
int Drawing_Random_Rectangles(Mat image, char* window_name, RNG rng)
{
Point pt1, pt2;
int lineType = 8;
int thickness = rng.uniform(-3, 10);
for (int i = 0; i < NUMBER; i++)
{
pt1.x = rng.uniform(x_1, x_2);
pt1.y = rng.uniform(y_1, y_2);
pt2.x = rng.uniform(x_1, x_2);
pt2.y = rng.uniform(y_1, y_2);
rectangle(image, pt1, pt2, randomColor(rng), MAX(thickness, -1), lineType);
imshow(window_name, image);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Drawing_Random_Ellipses
*/
int Drawing_Random_Ellipses(Mat image, char* window_name, RNG rng)
{
int lineType = 8;
for (int i = 0; i < NUMBER; i++)
{
Point center;
center.x = rng.uniform(x_1, x_2);
center.y = rng.uniform(y_1, y_2);
Size axes;
axes.width = rng.uniform(0, 200);
axes.height = rng.uniform(0, 200);
double angle = rng.uniform(0, 180);
ellipse(image, center, axes, angle, angle - 100, angle + 200,randomColor(rng), rng.uniform(-1, 9), lineType);
imshow(window_name, image);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Drawing_Random_Polylines
*/
int Drawing_Random_Polylines(Mat image, char* window_name, RNG rng)
{
int lineType = 8;
for (int i = 0; i< NUMBER; i++)
{
Point pt[2][3]; //两行三列 即两个多边形,每个多边形三个点
pt[0][0].x = rng.uniform(x_1, x_2);
pt[0][0].y = rng.uniform(y_1, y_2);
pt[0][1].x = rng.uniform(x_1, x_2);
pt[0][1].y = rng.uniform(y_1, y_2);
pt[0][2].x = rng.uniform(x_1, x_2);
pt[0][2].y = rng.uniform(y_1, y_2);
pt[1][0].x = rng.uniform(x_1, x_2);
pt[1][0].y = rng.uniform(y_1, y_2);
pt[1][1].x = rng.uniform(x_1, x_2);
pt[1][1].y = rng.uniform(y_1, y_2);
pt[1][2].x = rng.uniform(x_1, x_2);
pt[1][2].y = rng.uniform(y_1, y_2);
const Point* ppt[2] = { pt[0], pt[1] };
int npt[] = { 3, 3 };
polylines(image, ppt, npt, 2, true, randomColor(rng), rng.uniform(1, 10), lineType);
//img:在img表示的图像上绘制
//ppt:是指向多边形数组的指针,必须是const修饰的
// npts:是多边形顶点个数的数组名
// ncontours:绘制多边形的个数
// isClosed:表示多边形是否闭合,1表示闭合,0表示不闭合
// color:是填充的颜色
imshow(window_name, image);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Drawing_Random_Filled_Polygons
*/
int Drawing_Random_Filled_Polygons(Mat image, char* window_name, RNG rng)
{
int lineType = 8;
for (int i = 0; i < NUMBER; i++)
{
Point pt[2][3];
pt[0][0].x = rng.uniform(x_1, x_2);
pt[0][0].y = rng.uniform(y_1, y_2);
pt[0][1].x = rng.uniform(x_1, x_2);
pt[0][1].y = rng.uniform(y_1, y_2);
pt[0][2].x = rng.uniform(x_1, x_2);
pt[0][2].y = rng.uniform(y_1, y_2);
pt[1][0].x = rng.uniform(x_1, x_2);
pt[1][0].y = rng.uniform(y_1, y_2);
pt[1][1].x = rng.uniform(x_1, x_2);
pt[1][1].y = rng.uniform(y_1, y_2);
pt[1][2].x = rng.uniform(x_1, x_2);
pt[1][2].y = rng.uniform(y_1, y_2);
const Point* ppt[2] = { pt[0], pt[1] };
int npt[] = { 3, 3 };
fillPoly(image, ppt, npt, 2, randomColor(rng), lineType);
imshow(window_name, image);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Drawing_Random_Circles
*/
int Drawing_Random_Circles(Mat image, char* window_name, RNG rng)
{
int lineType = 8;
for (int i = 0; i < NUMBER; i++)
{
Point center;
center.x = rng.uniform(x_1, x_2);
center.y = rng.uniform(y_1, y_2);
circle(image, center, rng.uniform(0, 300), randomColor(rng),
rng.uniform(-1, 9), lineType);
imshow(window_name, image);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Displaying_Random_Text
*/
int Displaying_Random_Text(Mat image, char* window_name, RNG rng)
{
int lineType = 8;
for (int i = 1; i < NUMBER; i++)
{
Point org;
org.x = rng.uniform(x_1, x_2);
org.y = rng.uniform(y_1, y_2);
//把"Testing text rendering"放在图片上,文本的左下角确定在点org,
//字体大小在[0,8]整数范围随机分配,可扩展范围[0.1,5,1]
//文本颜色随机分配,文字厚度在[1,10]随机分配,可扩展范围[1,10].
putText(image, "Peace in the World", org, rng.uniform(0, 8),
rng.uniform(0, 100)*0.05 + 0.1, randomColor(rng), rng.uniform(1, 10), lineType);
imshow(window_name, image);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
/**
* @function Displaying_Big_End
*/
int Displaying_Big_End(Mat image, char* window_name, RNG rng)
{
//getTextSize函数获得文本参数的大小
Size textsize = getTextSize("The heart can do anything!", CV_FONT_HERSHEY_COMPLEX, 1.8, 2, 0);
Point org((window_width - textsize.width) / 2, (window_height - textsize.height) / 2);
int lineType = 8;
Mat image2;
for (int i = 0; i < 255; i += 2)
{
//imge2为原始图像和Scalar::all(i)对应像素点的差值,常用于饱和操作的中间变量
image2 = image - Scalar::all(i);
putText(image2, "The heart can do anything!", org, CV_FONT_HERSHEY_COMPLEX, 1.8,Scalar(i, i, 255), 5, lineType);
//cv::Mat& img, // 待绘制的图像
// const string& text, // 待绘制的文字
// cv::Point origin, // 文本框的左下角
// int fontFace, // 字体 (如cv::FONT_HERSHEY_PLAIN)
// double fontScale, // 尺寸因子,值越大文字越大
// cv::Scalar color, // 线条的颜色(RGB)
// int thickness = 1, // 线条宽度
// int lineType = 8, // 线型(4邻域或8邻域,默认8邻域)
// bool bottomLeftOrigin = false // true='origin at lower left'
imshow(window_name, image2);
if (waitKey(DELAY) >= 0)
{
return -1;
}
}
return 0;
}
运行结果
参考文章:https://blog.csdn.net/tianzhaixing2013/article/details/8741043?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.edu_weight