OpenCV4图像处理--图形绘制与填充

基本图形绘制

  • 点和线:line
  • 矩形:rectangle
  • 圆:circle
  • 椭圆:ellipse
  • 填充:线宽值小于 0 就是填充
  • PS: 基本图形绘制API中都有线条的颜色、线宽、线型和 shift :color: 线段的颜色,通过一个Scalar对象定义;thickness: 线条的宽度,默认是1;lineType: 线段的类型,可以取值8, 4, 和CV_AA, 分别代表8邻接连接线,4邻接连接线和反锯齿连接线。默认值为8邻接,为了获得更好地效果可以选用CV_AA(采用了高斯滤波);shift: 坐标点小数点位数,默认是0。
  • C++ API
	//创建全黑的画布
	Mat canvas = Mat::zeros(Size(512,512), CV_8UC3);
	namedWindow("canvas", WINDOW_AUTOSIZE);

	//相关绘制API: line rectangle circle ellipse
	//ps:如果线宽值小于0就是填充效果
	line(canvas, Point(10,10), Point(400,400), Scalar(0,0,255), 1, LINE_8);//线段绘制
	
	Rect rect(100,100,200,200);
	rectangle(canvas, rect, Scalar(0, 255, 0), 1, LINE_8);//矩形绘制
	
	circle(canvas, Point(256, 256), 100, Scalar(255,0,0), 1, LINE_8);//圆绘制
	
	RotatedRect  rrt;
	rrt.center = Point2f(256, 256);
	rrt.angle = 45.0;
	rrt.size = Size(100, 200);
	ellipse(canvas, rrt, Scalar(0,255,0), 1,  LINE_8 );//椭圆绘制
	
	imshow("canvas", canvas);

在这里插入图片描述

  • python API
#直线绘制
cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

在这里插入图片描述

#矩形绘制
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) 

在这里插入图片描述

#画圆
cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])

在这里插入图片描述

#画椭圆
cv2.ellipse(img, center, axes, rotateAngle, startAngle, endAngle, color[, thickness[, lineType[, shift]]]) 

在这里插入图片描述

#写文字
cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])

在这里插入图片描述

import numpy as np
import cv2 as cv

img = np.zeros((320, 320, 3), np.uint8)  # 生成一个空灰度图像
print(img.shape)  # 输出:(320, 320, 3)


#直线绘制
## 起点和终点的坐标
ptStart = (60, 60)
ptEnd = (260, 260)
point_color = (0, 255, 0)  # BGR
thickness = 1
lineType = 4
cv.line(img, ptStart, ptEnd, point_color, thickness, lineType)

#矩形绘制
##矩形左上角和右下角的坐标,绘制一个绿色矩形
ptLeftTop = (60, 60)
ptRightBottom = (260, 260)
point_color = (255, 0, 0) # BGR
thickness = 1
lineType = 4
cv.rectangle(img, ptLeftTop, ptRightBottom, point_color, thickness, lineType)

#画圆
##圆心为:(160, 160),半径为:60,颜色为:point_color,实心线
cv.circle(img, (160, 160), 60, point_color, 0)

#画椭圆
##绘制一个红色椭圆
ptCenter = (160, 160) # 中心点位置
axesSize = (100, 45) # 长轴半径为 100,短轴半径为 45
rotateAngle = 90 # 旋转角度为 90
startAngle = 0
endAngle = 360
point_color = (0, 0, 255) # BGR
thickness = 1
lineType = 4
cv.ellipse(img, ptCenter, axesSize, rotateAngle, startAngle, endAngle, point_color, thickness, lineType)

# 绘制一个蓝色上半椭圆
ptCenter = (160, 60) # 中心点位置
axesSize = (100, 45) # 长轴半径为 100,短轴半径为 45
rotateAngle = 0 # 旋转角度为 0
startAngle = 180
endAngle = 360
point_color = (0, 0, 255) # BGR
thickness = 1
lineType = 4
cv.ellipse(img, ptCenter, axesSize, rotateAngle, startAngle, endAngle, point_color, thickness, lineType)

#写文字
text = 'zcj'
org = (40, 80)
fontFace = cv.FONT_HERSHEY_COMPLEX
fontScale = 1
fontcolor = (0, 255, 0) # BGR
thickness = 1
lineType = 4
bottomLeftOrigin = 1
#cv.putText(img, text, org, fontFace, fontScale, fontcolor, thickness, lineType, bottomLeftOrigin)
cv.putText(img, text, org, fontFace, fontScale, fontcolor, thickness, lineType)


cv.namedWindow("image")
cv.imshow('image', img)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

随机图形绘制

  • 随机数类RNG生成坐标点和像素值,从而构造奇妙的图形,RNG类的使用
  • 代码示例:通过 waitKey 函数控制循环,绘制随机图形(直线和矩形),waitKey函数详解
	Mat image = Mat::zeros(Size(512, 512), CV_8UC3);
	int x1 = 0, y1 = 0;
	int x2 = 0, y2 = 0;
	RNG rng(12345);//seed
	
	while (true) {
	
		//image = Scalar(0, 0, 0);//让画面每次只显示一种绘制图形
		
		//产生随机坐标点
		x1 = (int)rng.uniform(0, 512);
		x2 = (int)rng.uniform(0, 512);
		y1 = (int)rng.uniform(0, 512);
		y2 = (int)rng.uniform(0, 512);
		
		//随机绘制线段
		line(image, Point(x1, y1), Point(x2, y2), Scalar(rng.uniform(10,256), rng.uniform(10, 256), rng.uniform(10, 256)), 1, LINE_8);

		//随机绘制矩形
		int w = abs(x2 - x1);
		int h = abs(y2 - y1);
		Rect rect2;
		rect2.x = x1;
		rect2.y = y1;
		rect2.width = w;
		rect2.height = h;
		rectangle(image, rect2, Scalar(255,0,0), 1, LINE_8);//绘制矩形
		
		imshow("image", image);

		//利用 waitKey 控制循环,键盘输入q退出
		if ( (char)waitKey(1000) == 'q') {
			break;
		}
	}

在这里插入图片描述

添加文字

  • putText API
putText(canvas, "hello opencv", Point(100, 50), FONT_HERSHEY_COMPLEX, 1.0, Scalar(0, 255, 0), 2, LINE_8);

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值