opencv简单形状绘制

今天继续opencv的学习,今天学习的内容是,画一些简单的形状,比如直线、方形等。

主要涉及的函数:

(1)Mat::zeros(Size size,Type type)//可以用来初始化一个背景全黑的画板。

(2)Point对象,初始化方式Point(int x,int y),用来建立一个点对象,在图形绘制上常用。

(3)Scalar对象,用来建立颜色对象,初始化时最对四个通道。

(4)line(Mat对象,点1,点2,颜色,线粗,线型)//Mat对象是画板对象,点1、点2是直线两端,颜色就是线的颜色,线型有三种,默认LINE_8,LINE_AA是抗锯齿类型。

(5)Rect对象用来确定矩形得对角点位置,初始化方式Rect(点1,点2),rectangle(Mat对象,Rect对象,颜色,线粗,线型)

(6)Size对象用来确定图形图像得长宽参数,初始化方式Size(int x,int y),ellipse(Mat对象,中心点对象,Size对象,旋转角度,绘制起始角度,绘制终止角度,颜色,线粗,线型)//Size对象得x代表椭圆长轴半径,y代表椭圆短轴半径,旋转角度表示椭圆得整体旋转角度,当角度为0时,长轴对应横轴,绘制起始和终止角度代表绘制覆盖的角度。

(7)circle(Mat对象,圆心点,半径,颜色,线粗,线型)

(8)多边形填充,实现比较复杂,看演示代码。

(9)填写文字putText(Mat对象,要写的字符串,初始位置点,字体,字的大小,颜色,线粗,线型)


演示代码:

#include<opencv2\opencv.hpp>
#include<iostream>
#include<math.h>
 
using namespace std;
using namespace cv;

void showLine(Mat &pic);
void showRect(Mat &pic);
void showEllipse(Mat &pic);
void showCircle(Mat &pic);
void showPoly(Mat &pic);
void showText(Mat &pic);

int main()
{
	Size size(1000, 800);
	Mat pic=Mat::zeros(size,CV_8UC3);
	showLine(pic);
	showRect(pic);
	showEllipse(pic);
	showCircle(pic);
	showPoly(pic);
	showText(pic);
	namedWindow("show");
	imshow("show", pic);
	waitKey(0);
	return 0;
}

void showLine(Mat &pic)
{
	Point p1(100, 100), p2(500, 500);
	Scalar color(0, 0, 255);
	line(pic, p1, p2, color, 2, LINE_AA);
}
void showRect(Mat &pic)
{
	Point p1(100, 100), p2(500, 500);
	Rect rec(p1, p2);
	Scalar color(0, 255, 0);
	rectangle(pic, rec, color, 2, LINE_AA);
}
void showEllipse(Mat &pic)
{
	Point cen(300, 300);
	Size len(200, 100);
	Scalar color(255, 0, 0);
	ellipse(pic, cen, len, 0, 0, 360, color, 2, LINE_AA);
	ellipse(pic, cen, len, 45, 0, 360, color, 2, LINE_AA);
	ellipse(pic, cen, len, 90, 0, 180, color, 2, LINE_AA);
}
void showCircle(Mat &pic)
{
	Point cen(300, 300);
	Scalar color(255, 255, 255);
	circle(pic, cen, 200, color, 2, LINE_AA);
}
void showPoly(Mat &pic)
{
	Point p[1][4];//表示多边形路径点
	p[0][0] = Point(800, 300);
	p[0][1] = Point(900, 500);
	p[0][2] = Point(700, 500);
	p[0][3] = Point(800, 300);//起始点和终止点相同
	const Point* pp[] = { p[0] };//获取const Point的二维数组指针
	int np[] = { 4 };//代表点数
	Scalar color(0, 200, 100);
	fillPoly(pic, pp, np, 1,color, 8);//pp和np必须要这么写,第四个参数写1就行,表示画一圈,这个函数很死板
}
void showText(Mat &pic)
{
	Point p(300, 50);
	Scalar color(0, 0, 255);
	putText(pic, "Hello World!!!", p, CV_FONT_BLACK, 2.0, color, 2, LINE_AA);
}


效果:




=========================================分割线=============================================================

下面在说一下随机直线

主要是利用RNG对象的uniform函数生成随机数,并用这些随机数建立线的两端点,随带介绍一下waitKey函数,waitKey(int x)//表示程序等待xms,如果有按键输入,就返回按键的ASCII,否则返回0xff(之前网上说返回-1,但是返回值是int,我电脑上返回的是255,但是有的人返回-1,这我就不太懂了),如果x==0,则一直等待按键输入。

演示代码:

#include<opencv2\opencv.hpp>
#include<iostream>
#include<math.h>
#include<algorithm>
#include<string.h>

using namespace std;
using namespace cv;

void showRandomLine(Mat &pic);

int main()
{
	Size size(1000, 800);
	Mat pic = Mat::zeros(size, CV_8UC3);
	showRandomLine(pic);
	waitKey(0);
	return 0;
}

void showRandomLine(Mat &pic)
{
	RNG rng;
	int a;
	Point p1, p2;
	for(int i=0;i<100;i++)
	{
		p1.x = rng.uniform(0, 1000);
		p1.y = rng.uniform(0, 800);
		p2.x = rng.uniform(0, 1000);
		p2.y = rng.uniform(0, 800);
		int b = rng.uniform(0, 255);
		int g = rng.uniform(0, 255);
		int r = rng.uniform(0, 255);
		Scalar color(b, g, r);
		line(pic, p1, p2, color, 1, LINE_8);
		if (waitKey(50) != 0xff)
			break;
		imshow("show", pic);
	}
}

效果:




猜你喜欢

转载自blog.csdn.net/ZouCharming/article/details/70175678
今日推荐