(07)绘制形状与文字

/*
*绘制形状与文字
	cv::Point数据结构:代表了一个点的坐标,一个二维点的坐标
		Point表示2D平面上一个点x, y
		Point p;
		p.x = 10;
		p.y = 8;
		or
		p = Point(10, 8);
	cv::Scalar数据结构:代表颜色的向量,RGB色彩空间经常是数有三个值或者灰度图像赋给一个值
		Scalar表示四个元素的向量,基类是Vec向量这个类
		总共有四个元素构造函数的可以声明一个,两个,三个, 四个都可以,不能超过四个,零个也可以,然后再给它赋值也可以
		Scalar(a, b, c); a = blue, b = green, c = red 表示RGB三个通道
	绘制线、矩形、圆、椭圆等基本几何图形
		画线cv::line (LINE_4\LINE_8\LINE_AA) 有一个参数是linetype 就是绘制线的类型 其中类型LINE_AA表示反锯齿 就是绘制线和几何形状的圆、椭圆等
		画椭圆cv::ellipse
		画矩形cv::rectangle
		画圆cv::circle
		画填充cv::fillPoly
	随机生成线与绘制文本
*/

#include 
#include 

using namespace cv;
using namespace std;

//定义全局变量
Mat bgImage;
const char* drawdemo_win = "drawdemo window";

//定义一个方法,函数声明
void MyLine(); //画一条线
void MyRectangle();//画一个矩形
void MyEllipse(); //绘制一个椭圆
void MyCircle(); //画一个圆
void MyPolygen(); //多边形的填充功能
void RandomLineDemo(); //画一个随机的线

int main(int argc, char** argv)
{
	bgImage = imread("D:/A_Graduation/picture/Fusion/source17_1.tif");

	if (!bgImage.data)
	{
		printf("Could not load image src1...\n");
		return -1;
	}

	//函数调用
	MyLine();
	MyRectangle();
	MyEllipse();
	MyCircle();
	MyPolygen();
	//RandomLineDemo();

	//                                 字的位置            字体类型         字体大小              字体线的厚度
	putText(bgImage, "Hello OpenCV", Point(30, 30), CV_FONT_HERSHEY_COMPLEX, 1.0, Scalar(0, 0, 255), 3, 8);
	
	char input_win[] = "input image"; 
	namedWindow(input_win, CV_WINDOW_AUTOSIZE);
	imshow(input_win, bgImage);

	waitKey(0);

	return 0;
}

//函数实现
void MyLine()
{
	Point p1 = Point(20, 30);
	Point p2;
	p2.x = 300;
	p2.y = 300;
	Scalar color = Scalar(0, 0, 255); //红色
	line(bgImage, p1, p2, color, 2, LINE_AA); //thickness越大线越宽,lineType默认是8即LINE_8
}

void MyRectangle()
{
	Rect rect = Rect(20, 10, 30, 30); //参数分别表示起始位置、宽、高
	Scalar color = Scalar(255, 0, 0); //蓝色
	rectangle(bgImage, rect, color, 3); //参数分别表示背景图像,矩形,颜色,线宽,线的类型默认是LINE_8
}

void MyEllipse()
{
	Scalar color = Scalar(0, 255, 0);
	ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols/4, bgImage.rows/8), 90, 0, 360, color, 2, LINE_8); 
	//参数分别表示背景图像, 椭圆的中心,椭圆的半径,椭圆的长轴和短轴,椭圆的倾斜程度,椭圆的起始角度、终止角度、椭圆线的颜色、线的宽度,线的类型
}

void MyCircle()
{
	Scalar color = Scalar(0, 255, 255);
	Point center = Point(bgImage.cols / 2, bgImage.rows / 2); //圆心的位置
	circle(bgImage, center, 20, color, 2, 8); //参数分别表示背景图像,圆心位置,半径长度,线的颜色,线宽,线的类型
}

void MyPolygen()
{
	//声明多边形的点的坐标,声明一个二维的,fillploy接收的是一个二维的指针
	Point pts[1][5];
	pts[0][0] = Point(100, 100);
	pts[0][1] = Point(100, 200);
	pts[0][2] = Point(200, 200);
	pts[0][3] = Point(200, 100);
	pts[0][4] = Point(100, 100);

	const Point* ppts[1] = { pts[0] };
	int npt[] = { 5 };
	fillPoly(bgImage, ppts, npt, 1, Scalar(0, 255, 255), 8);
	//ppts:折线中拐点坐标指针;npt:折线拐点个数指针;1:就画一个,对应pts的1
	//这里有一篇我觉得解释的挺好的博客 http://blog.csdn.net/yinkailin/article/details/12406975
}

void RandomLineDemo()
{
	Mat bg = Mat::zeros(bgImage.size(), bgImage.type());
	//学习随机数这个类生成随机数,生成随机的颜色
	//首先要有一个随机数生成的种子
	RNG rng(12345);

	//生成线的位置,定义两个点
	Point pt1, pt2;

	for (int i = 0; i < 100000; i++)
	{
		pt1.x = rng.uniform(0, bgImage.cols); //生成一个uniform的随机数,不要超过背景图的范围
		pt1.y = rng.uniform(0, bgImage.rows);
		pt2.x = rng.uniform(0, bgImage.cols);
		pt2.y = rng.uniform(0, bgImage.rows);

		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); //生成随机颜色,随机数在0-255之间

		line(bg, pt1, pt2, color, 1, 8);

		namedWindow("RandomLine Window", CV_WINDOW_AUTOSIZE);
		imshow("RandomLine Window", bg);

		if (waitKey(50) > 0) //50毫秒绘制一次
		{
			break;
		}
		/*
		waitKey(x);
		参数x: 等待x ms,如果在此期间有按键按下,则立即结束并返回按下按键的ASCII码,否则返回-1
		如果x=0,那么无限等待下去,直到有按键按下
		*/
	}
}

你可能感兴趣的:(OpenCV)