opencv学习笔记七(绘制图像和文字)

使用cv::Point与cv::Scalar

  • Point表示2D平面上一个点x,y
    Point p;
    p.x = 10;
    p.y = 8;
    or
    p = Pont(10,8);
  • 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

相关函数

1,绘制直线
void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
参数1:img,要绘制线段的图像。
参数2:pt1, 线段的起点。
参数3:pt2,线段的终点。
参数4:color,线段的颜色,通过一个Scalar对象定义。
参数5:thickness, 线条的宽度。
参数6:lineType, 线段的类型。可以取值8, 4, 和CV_AA, 分别代表8邻接连接线,4邻接连接线和反锯齿连接线。默认值为8邻接。为了获得更好地效果可以选用CV_AA(采用了高斯滤波)。
参数7:shift,坐标点小数点位数。(一般用不到)
功能:在图像img绘制由点pt1到点pt2的直线,其中颜色为color,线宽为thickness。

2,绘制长方形

  • void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
    参数1:img,图像.
    参数2:pt1,矩形的一个顶点。
    参数3:pt2,矩形对角线上的另一个顶点
    参数4:color,线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image)。
    参数5:thickness,组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。
    参数6:line_type,线条的类型。
    参数7:shift,坐标点的小数点位数。
  • Rect roi_rect = Rect(128, 128, roi.cols, roi.rows);
    Rect(x,y,width,height)
    参数1:x为所定义矩形的左上角横坐标
    参数2:y为所定义矩形的左上角纵坐标
    参数3:width为所定义矩形的宽度
    参数4:height 为所定义矩形的高度
    功能:Rect为矩形类用来定义矩形的数据,再使用cvRectangle函数将其绘制出来。
  • rectangle(bgImage, rect, color, 2, LINE_8);
    此处就是将rect定义的矩形使用rectangle函数绘制到图像bgImage上去。

3,绘制椭圆
void cvEllipse( CvArr* img, CvPoint center, CvSize axes, double angle, double start_angle, double end_angle, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
参数1:img,图像。
参数2:center,椭圆圆心坐标。
参数3:axes,轴的长度。
参数4:angle,偏转的角度。
参数5:start_angle,圆弧起始角的角度。.
参数6:end_angle,圆弧终结角的角度。
参数7:color,线条的颜色。
参数8:thickness,线条的粗细程度。
参数9:line_type,线条的类型。
参数10:shift,圆心坐标点和数轴的精度。
功能:函数cvEllipse用来绘制或者填充一个简单的椭圆弧或椭圆扇形。圆弧被ROI矩形所忽略。反走样弧线和粗弧线使用线性分段近似值。所有的角都是以角度的形式给定的。

4,绘制圆
void cvCircle( CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
参数1:img,图像。
参数2:center,圆心坐标。
参数3:radius,圆形的半径。
参数4:color,线条的颜色。
参数5:thickness,如果是正数,表示组成圆的线条的粗细程度。否则,若为负数,表示圆是否被填充。
参数6:line_type,线条的类型。
参数7:shift,圆心坐标点和半径值的小数点位数。(一般用不到)
功能:函数cvCircle绘制或填充一个给定圆心和半径的圆。圆被感兴趣矩形所裁剪。 若指定圆的颜色,可以使用宏 CV_RGB ( r, g, b ),或者Scalar( r, g, b )。

5,填充多边形

  • void fillPoly(Mat& img, const Point** pts, const int* npts, int ncontours, const Scalar& color, int lineType = LINE_8, int shift = 0, Point offset = Point() );
    参数1:img,图像
    参数2:pts,多边形的顶点集(是个二维数组)
    参数3:npts,多边形顶点数目
    参数4:ncontours,要绘制的多边形数量为1
    参数5:多边形的颜色定义为Scarlar(255,255,255),即RGB的值为白色
    参数6:lineType 多边形线条类型。
    参数7:offset 偏移量设置,此处可以对多边形进行位置的偏移。

6,绘制文字
void cv::putText(cv::Mat& img, const string& text, cv::Point origin, int fontFace, double fontScale, cv::Scalar color, int thickness = 1, int lineType = 8, bool bottomLeftOrigin = false);
参数1:img, 待绘制的图像
参数2: text, 待绘制的文字
参数3:origin, 文本框的左下角
参数4:fontFace, 字体 (如cv::FONT_HERSHEY_PLAIN)
参数5: fontScale, 尺寸因子,值越大文字越大
参数6: color, 线条的颜色(RGB)
参数7:thickness,线条宽度
参数8:lineType,线型
参数9:当为true时文字处于文本框左下角,否则处于左上角

代码实现效果

1,绘制直线在这里插入图片描述
2,绘制长方形
在这里插入图片描述
3,绘制椭圆
在这里插入图片描述
4,绘制圆
在这里插入图片描述
5,填充多边形
在这里插入图片描述
6,绘制文字
在这里插入图片描述
7,整体显示效果
在这里插入图片描述

8,绘制随机线(自定义函数)
在这里插入图片描述

代码演示

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

using namespace std;
using namespace cv;


const char* drawdemo_win = "draw shapes and text demo";//定义一个窗口名
void Mylines(Mat &bgImage);//自定义函数(里面需传递图像变量)
void MyRectangle(Mat &bgImage);
void MyEllipse(Mat &bgImage);
void MyCircle(Mat &bgImage);
void MyPolygon(Mat &bgImage);
void RandomLineDemo(Mat &bgImage);

int main(){
	Mat bgImage = imread("1.jpg");
	if (bgImage.empty()){
		cout << "image could not load ..." << endl;
		getchar();
		return -1;
	}
	Mylines(bgImage);
	MyRectangle(bgImage);
	MyEllipse(bgImage);
	MyCircle(bgImage);
	MyPolygon(bgImage);

	putText(bgImage, "Hello OpenCV", Point(300, 300), CV_FONT_HERSHEY_COMPLEX, 1.0, Scalar(12, 23, 200), 3, 8);//打印文字
	imshow(drawdemo_win, bgImage);

	//RandomLineDemo(bgImage);
	waitKey(0);
	return 0;
}

void Mylines(Mat &bgImage){
	Point p1 = Point(20, 30);
	Point p2;
	p2.x = 300;
	p2.y = 300;
	Scalar color = Scalar(0, 0, 255);//定义一个颜色为红色
	line(bgImage, p1, p2, color, 1, LINE_8);//在图像bgImage上画一条由p1到p2点的线
	//line(bgImage, p1, p2, color, 1, LINE_AA);//采用反锯齿,效果比较好,但效率略低
}

void MyRectangle(Mat &bgImage){
	Rect rect = Rect(300, 50, 300, 300);
	Scalar color = Scalar(255, 0, 0);
	rectangle(bgImage, rect, color, 2, LINE_8);
}

//绘制椭圆
void MyEllipse(Mat &bgImage) {
	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);//Point椭圆中心,Size表示长轴、短轴
	//ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows / 8), 90, 0, 180, color, 2, LINE_8);//此处只绘制一半的弧度
}

void MyCircle(Mat &bgImage) {
	Scalar color = Scalar(0, 255, 255);
	Point center = Point(bgImage.cols / 2, bgImage.rows / 2);
	circle(bgImage, center, 150, color, 2, 8);
}

//填充多边形
void MyPolygon(Mat &bgImage) {
	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(150, 150);

	const Point* ppts[] = { pts[0] };
	int npt[] = { 5 };
	Scalar color = Scalar(255, 12, 255);

	fillPoly(bgImage, ppts, npt, 1,color,8);
}

//画随机线
void RandomLineDemo(Mat &bgImage) {
	RNG rng(12345);//定义一个随机数
	Point pt1;
	Point pt2;
	Mat bg = Mat::zeros(bgImage.size(), bgImage.type());//创建一个空白图像
	namedWindow("random line demo", CV_WINDOW_AUTOSIZE);
	for (int i = 0; i < 100000; i++) {
		pt1.x = rng.uniform(0, bgImage.cols);//随机数在image图像内生成(不能超过边缘)
		pt2.x = rng.uniform(0, bgImage.cols);
		pt1.y = rng.uniform(0, bgImage.rows);
		pt2.y = rng.uniform(0, bgImage.rows);
		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
		if (waitKey(50) > 0) {//在50ms后跳出循环
			break;
		}
		line(bg, pt1, pt2, color, 1, 8);
		imshow("random line demo", bg);
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吾名招财

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

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

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

打赏作者

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

抵扣说明:

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

余额充值