opencv之随机生成各种类型(线,折线--也可称为多边形,矩形,圆,椭圆,文本)

相关知识:
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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w5875895

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值