[OpenCV] 08-绘制形状和文字

使用cv::Pointcv::Scalar

  1. Point表示2D平面上一个点x,y
Point p;
	p.x = 10;
	p.y = 8;
	or
	p = Pont(10,8);	
  1. Scalar表示四个元素的向量

    Scalar(a, b, c); // a = blue, b = green, c = red 表示RGB三个通道

绘制线、矩形、园、椭圆等基本几何形状

画线 `cv::line (LINE_4\LINE_8\LINE_AA)`
画椭圆`cv::ellipse`
画矩形`cv::rectangle`
画圆`cv::circle`
画填充`cv::fillPoly`
随机数生成`cv::RNG`

生成高斯随机数gaussian (double sigma)

生成正态分布随机数uniform (int a, int b)

绘制添加文字

`putText`函数中设置`fontFace(cv::HersheyFonts)`,
- fontFace, CV_FONT_HERSHEY_PLAIN 
- fontScale , 1.0, 2.0~ 8.0
void cv::putText(                
		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'        
		);	

代码演示:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

void MyLines(Mat image);
void MyEllipse(Mat image);
void MyCircle(Mat image);
void MyRectangle(Mat image);
void MyFillpoly(Mat image);

int main(char argc,char** argv)
{
	Mat myImage = imread("women.jpg", 1);
	if (!myImage.data)
	{
		cout << "couldn't load image..." << endl;
		return -1;
	}
	MyLines(myImage);
	MyEllipse(myImage);
	MyCircle(myImage);
	MyRectangle(myImage);
	MyFillpoly(myImage);
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input",myImage);
	waitKey(0);
	return 0;
}

//画直线函数
void MyLines(Mat image)             
{
	Point p1 = Point(20, 20);                          //点类
	Point p2;
	p2.x = 400;
	p2.y = 400;
	Scalar color = Scalar(0, 0, 255);                  //颜色
	line(image, p1, p2, color, 2,LINE_AA);           //参数:背景图片、点1、点2、颜色、线宽、线型
}

//画椭圆函数
void MyEllipse(Mat image)
{
	Scalar color = Scalar(0, 255, 0);
	ellipse(image, Point(image.rows / 2, image.cols / 2), Size(image.rows / 8,
	image.cols / 4),90,0,360,color, 2, LINE_8);//参数:背景图片、中心点、长短半径、旋转角度、0,360——范围、颜色、线宽、线型
}

//画圆函数
void MyCircle(Mat image)
{
	Point p=Point(image.rows / 2, image.cols / 2);
	Scalar color = Scalar(127, 0, 255);
	circle(image, p, image.rows / 8, color, 2, LINE_8);  //参数:背景图片、圆心、半径、颜色、线宽、线型、
}

//画矩形函数
void MyRectangle(Mat image)
{
	Rect rect = Rect(100,200,100,50);    //Rect类:成员变量x、y、width、height,分别为左上角点的坐标和矩形的宽和高
	Scalar color = Scalar(255, 78, 94);
	rectangle(image, rect, color, 2, LINE_4); //参数:背景图片、矩形类、线宽、线型
}

//画填充函数
void MyFillpoly(Mat image)
{
	Point pts[1][5];
	pts[0][0] = Point(200, 200);
	pts[0][1] = Point(300, 200); 
	pts[0][2] = Point(300, 100);
	pts[0][3] = Point(200, 100);
	pts[0][4] = Point(200, 200);
	const Point*ppts[] = { pts[0] };
	int npt[] = { 5 };
	Scalar color = Scalar(0, 255, 189);
	fillPoly(image, ppts, npt, 1, color, LINE_8);  //参数:背景图片、数据点指针、数据点个数、图像个数、颜色、线性
}

在这里插入图片描述

//画随机直线函数
void RandomLineDemo(Mat image)
{
	RNG rng(12345);      //随机数类 使用种子12345产生一个64位随机整数
	Point p1, p2;
	Mat image1 = Mat::zeros(image.size(), image.type());
	namedWindow("Random line Remo", WINDOW_AUTOSIZE);
	while (1)
	{
		p1.x = rng.uniform(0, image1.cols);
		p1.y = rng.uniform(0, image1.rows);
		p2.x = rng.uniform(0, image1.cols);
		p2.y = rng.uniform(0, image1.rows);
		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255),rng.uniform(0, 255));
		if (waitKey(50) > 0)          //等待时间为50ms,如果在这个时间段内, 用户按下任意按键(ASCII码>0),则跳出循环
		{
			break;
		}
		line(image1, p1, p2, color, 1, LINE_8);
		imshow("Random line Remo", image1);
	}
}
	

备注:以上内容转载笔者早期OneNote笔记,多为基础知识记录,比较简陋。
后记:笔者才疏学浅,如有错误,望指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值