赞
踩
OpenCV提供了许多用于绘制图形的方法
包括绘制线段的line()方法、绘制矩形的 rectangle()方法、绘制圆形的 circle()方法、绘制多边形的 polylines()方法和绘制文字的 putText()方法
本章将依次对上述各个方法进行讲解,并作出相应实验。
因为 OpenCV 中的颜色值是一个列表(例如,(0,0,255)等),所以 color=np.random.randint(0,high=256,size=(3,)).tolist()中的“.tolist()”不能被忽略,否则运行程序时会发生错误。
opencv 绘制线段为line() 方法
函数为下,可以绘制彩色的线段
由于 OpenCV默认的通道顺序是B→G→R,因此将使用(0,0,255)表示红色
绘制下面的图像:
- import numpy as np # 导入Python中的numpy模块
- import cv2
-
- # np.zeros():创建了一个画布
- # (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
- # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
- canvas = np.zeros((300, 300, 3), np.uint8)
- # 在画布上,绘制一条起点坐标为(50, 50)、终点坐标为(250, 50),蓝色的,线条宽度为5的线段
- canvas = cv2.line(canvas, (50, 50), (250, 50), (255, 0, 0), 5)
- # 在画布上,绘制一条起点坐标为(50, 150)、终点坐标为(250, 150),绿色的,线条宽度为10的线段
- canvas = cv2.line(canvas, (50, 150), (250, 150), (0, 255, 0), 10)
- # 在画布上,绘制一条起点坐标为(50, 250)、终点坐标为(250, 250),红色的,线条宽度为15的线段
- canvas = cv2.line(canvas, (50, 250), (250, 250), (0, 0, 255), 15)
- # 在画布上,绘制一条起点坐标为(150, 50)、终点坐标为(150, 250),黄色的,线条宽度为20的线段
- canvas = cv2.line(canvas, (150, 50), (150, 250), (0, 255, 255), 20)
- cv2.imshow("Lines", canvas) # 显示画布
- cv2.waitKey()
- cv2.destroyAllWindows()
展示:
opencv 绘制线段为 rectangle() 方法
函数如下:
代码:
- import numpy as np # 导入Python中的numpy模块
- import cv2
-
- # np.zeros():创建了一个画布
- # (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
- # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
- canvas = np.zeros((300, 300, 3), np.uint8)
- # 在画布上绘制一个左上角坐标为(50,50),右下角坐标为(200,150),青色的,线条宽度为20的矩形边框
- canvas = cv2.rectangle(canvas, (50, 50), (200, 150), (255, 255, 0), 20)
- cv2.imshow("Rectangle", canvas) # 显示画布
- cv2.waitKey()
- cv2.destroyAllWindows()
展示:
绘制正方形:
- import numpy as np # 导入Python中的numpy模块
- import cv2
-
- # np.zeros():创建了一个画布
- # (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
- # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
- canvas = np.zeros((300, 300, 3), np.uint8)
- # 绘制一个左上角坐标为(50,50),右下角坐标为(250,250),红色的,线条宽度为40的正方形边框
- canvas = cv2.rectangle(canvas, (50, 50), (250, 250), (0, 0, 255), 40)
- # 绘制一个左上角坐标为(90,90),右下角坐标为(210,210),绿色的,线条宽度为30的正方形边框
- canvas = cv2.rectangle(canvas, (90, 90), (210, 210), (0, 255, 0), 30)
- # 绘制一个左上角坐标为(120,120),右下角坐标为(180,180),蓝色的,线条宽度为20的正方形边框
- canvas = cv2.rectangle(canvas, (120, 120), (180, 180), (255, 0, 0), 20)
- # 绘制一个左上角坐标为(140,140),右下角坐标为(160,160),黄色的实心正方形
- canvas = cv2.rectangle(canvas, (140, 140), (160, 160), (0, 255, 255), -1)
- cv2.imshow("Square", canvas) # 显示画布
- cv2.waitKey()
- cv2.destroyAllWindows()
展示:
opencv 绘制线段为circle() 方法
函数如下:
绘制红绿灯:
- import numpy as np # 导入Python中的numpy模块
- import cv2
-
- # np.zeros():创建了一个画布
- # (100, 300, 3):一个100 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
- # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
- canvas = np.zeros((100, 300, 3), np.uint8)
- # 在画布上,绘制一个圆心坐标为(50, 50),半径为40,红色的实心圆形
- canvas = cv2.circle(canvas, (50, 50), 40, (0, 0, 255), -1)
- # 在画布上,绘制一个圆心坐标为(150, 50),半径为40,黄色的实心圆形
- canvas = cv2.circle(canvas, (150, 50), 40, (0, 255, 255), -1)
- # 在画布上,绘制一个圆心坐标为(250, 50),半径为40,绿色的实心圆形
- canvas = cv2.circle(canvas, (250, 50), 40, (0, 255, 0), -1)
- cv2.imshow("TrafficLights", canvas) # 显示画布
- cv2.waitKey()
- cv2.destroyAllWindows()
绘制同心圆代码:
- import numpy as np # 导入Python中的numpy模块
- import cv2
-
- # np.zeros():创建了一个画布
- # (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
- # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
- canvas = np.zeros((300, 300, 3), np.uint8)
- # shape[1]表示画布的宽度,center_X表示圆心的横坐标
- # 圆心的横坐标等于画布的宽度的一半
- center_X = int(canvas.shape[1] / 2)
- # shape[0]表示画布的高度,center_X表示圆心的纵坐标
- # 圆心的纵坐标等于画布的高度的一半
- center_Y = int(canvas.shape[0] / 2)
- # r表示半径;其中,r的值分别为0、30、60、90和120
- for r in range(0, 150, 30):
- # 绘制一个圆心坐标为(center_X, center_Y),半径为r,绿色的,线条宽度为5的圆形
- cv2.circle(canvas, (center_X, center_Y), r, (0, 255, 0), 5)
- cv2.imshow("Circles", canvas) # 显示画布
- cv2.waitKey()
- cv2.destroyAllWindows()
绘制随机圆:
- import numpy as np # 导入Python中的numpy模块
- import cv2
-
- # np.zeros():创建了一个画布
- # (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
- # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
- canvas = np.zeros((300, 300, 3), np.uint8)
- # 通过循环绘制27个实心圆
- for numbers in range(0, 28):
- # 获得随机的圆心横坐标,这个横坐标在[0, 299]范围内取值
- center_X = np.random.randint(0, high = 300)
- # 获得随机的圆心纵坐标,这个纵坐标在[0, 299]范围内取值
- center_Y = np.random.randint(0, high = 300)
- # 获得随机的半径,这个半径在[11, 70]范围内取值
- radius = np.random.randint(11, high = 71)
- # 获得随机的线条颜色,这个颜色由3个在[0, 255]范围内的随机数组成的列表表示
- color = np.random.randint(0, high = 256, size = (3,)).tolist()
- # 绘制一个圆心坐标为(center_X, center_Y),半径为radius,颜色为color的实心圆形
- cv2.circle(canvas, (center_X, center_Y), radius, color, -1)
- cv2.imshow("Circles", canvas) # 显示画布
- cv2.waitKey()
- cv2.destroyAllWindows()
opencv 绘制线段为ploylines() 方法
函数如下:
代码:
- import numpy as np # 导入Python中的numpy模块
- import cv2
-
- # np.zeros():创建了一个画布
- # (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
- # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
- canvas = np.zeros((300, 300, 3), np.uint8)
- # 按顺时针给出等腰梯形4个顶点的坐标
- # 这4个顶点的坐标构成了一个大小等于“顶点个数 * 1 * 2”的数组
- # 这个数组的数据类型为np.int32
- pts = np.array([[100, 50], [200, 50], [250, 250], [50, 250]], np.int32)
- # 在画布上根据4个顶点的坐标,绘制一个闭合的,红色的,线条宽度为5的等腰梯形边框
- canvas = cv2.polylines(canvas, [pts], True, (0, 0, 255), 5)
- cv2.imshow("Polylines", canvas) # 显示画布
- cv2.waitKey()
- cv2.destroyAllWindows()
代码:
- import cv2
- import time
- import numpy as np
-
- width, height = 200, 200 # 画面的宽和高
- r = 20 # 圆半径
- x = r + 20 # 圆心和坐标起始坐标
- y = r + 100 # 圆形纵坐标起始坐标
- x_offer = y_offer = 4 # 每一帧的移动速度
-
- while cv2.waitKey(1) == -1: # 按下任何按键之后
- if x > width - r or x < r: # 如果圆的横坐标超出边界
- x_offer *= -1 # 横坐标速度取相反值
- if y > height - r or y < r: # 如果圆的纵坐标超出边界
- y_offer *= -1 # 纵坐标速度取相反值
- x += x_offer # 圆心按照横坐标速度移动
- y += y_offer # 圆心按照纵坐标速度移动
- img = np.ones((width, height, 3), np.uint8) * 255 # 绘制白色背景面板
- cv2.circle(img, (x, y), r, (255, 0, 0), -1) # 绘制圆形
- cv2.imshow("img", img) # 显示图像
- time.sleep(1 / 60) # 休眠1/60秒,也就是秒60帧
-
- cv2.destroyAllWindows() # 释放所有窗体
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。