当前位置:   article > 正文

Opencv 绘制线段、矩形、圆形、多边形操作_opencv 画多边形

opencv 画多边形

1、前言

OpenCV提供了许多用于绘制图形的方法

包括绘制线段的line()方法、绘制矩形的 rectangle()方法、绘制圆形的 circle()方法、绘制多边形的 polylines()方法和绘制文字的 putText()方法

本章将依次对上述各个方法进行讲解,并作出相应实验。

因为 OpenCV 中的颜色值是一个列表(例如,(0,0,255)等),所以 color=np.random.randint(0,high=256,size=(3,)).tolist()中的“.tolist()”不能被忽略,否则运行程序时会发生错误。

2、绘制线段

opencv  绘制线段为line() 方法

2.1 函数介绍

函数为下,可以绘制彩色的线段

由于 OpenCV默认的通道顺序是B→G→R,因此将使用(0,0,255)表示红色

2.2 实验代码

绘制下面的图像:

  1. import numpy as np # 导入Python中的numpy模块
  2. import cv2
  3. # np.zeros():创建了一个画布
  4. # (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
  5. # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
  6. canvas = np.zeros((300, 300, 3), np.uint8)
  7. # 在画布上,绘制一条起点坐标为(50, 50)、终点坐标为(250, 50),蓝色的,线条宽度为5的线段
  8. canvas = cv2.line(canvas, (50, 50), (250, 50), (255, 0, 0), 5)
  9. # 在画布上,绘制一条起点坐标为(50, 150)、终点坐标为(250, 150),绿色的,线条宽度为10的线段
  10. canvas = cv2.line(canvas, (50, 150), (250, 150), (0, 255, 0), 10)
  11. # 在画布上,绘制一条起点坐标为(50, 250)、终点坐标为(250, 250),红色的,线条宽度为15的线段
  12. canvas = cv2.line(canvas, (50, 250), (250, 250), (0, 0, 255), 15)
  13. # 在画布上,绘制一条起点坐标为(150, 50)、终点坐标为(150, 250),黄色的,线条宽度为20的线段
  14. canvas = cv2.line(canvas, (150, 50), (150, 250), (0, 255, 255), 20)
  15. cv2.imshow("Lines", canvas) # 显示画布
  16. cv2.waitKey()
  17. cv2.destroyAllWindows()

展示:

3、绘制矩形

opencv  绘制线段为 rectangle() 方法

3.1 函数介绍

函数如下:

3.2 实验代码

代码:

  1. import numpy as np # 导入Python中的numpy模块
  2. import cv2
  3. # np.zeros():创建了一个画布
  4. # (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
  5. # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
  6. canvas = np.zeros((300, 300, 3), np.uint8)
  7. # 在画布上绘制一个左上角坐标为(50,50),右下角坐标为(200,150),青色的,线条宽度为20的矩形边框
  8. canvas = cv2.rectangle(canvas, (50, 50), (200, 150), (255, 255, 0), 20)
  9. cv2.imshow("Rectangle", canvas) # 显示画布
  10. cv2.waitKey()
  11. cv2.destroyAllWindows()

展示:

绘制正方形:

  1. import numpy as np # 导入Python中的numpy模块
  2. import cv2
  3. # np.zeros():创建了一个画布
  4. # (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
  5. # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
  6. canvas = np.zeros((300, 300, 3), np.uint8)
  7. # 绘制一个左上角坐标为(50,50),右下角坐标为(250,250),红色的,线条宽度为40的正方形边框
  8. canvas = cv2.rectangle(canvas, (50, 50), (250, 250), (0, 0, 255), 40)
  9. # 绘制一个左上角坐标为(90,90),右下角坐标为(210,210),绿色的,线条宽度为30的正方形边框
  10. canvas = cv2.rectangle(canvas, (90, 90), (210, 210), (0, 255, 0), 30)
  11. # 绘制一个左上角坐标为(120,120),右下角坐标为(180,180),蓝色的,线条宽度为20的正方形边框
  12. canvas = cv2.rectangle(canvas, (120, 120), (180, 180), (255, 0, 0), 20)
  13. # 绘制一个左上角坐标为(140,140),右下角坐标为(160,160),黄色的实心正方形
  14. canvas = cv2.rectangle(canvas, (140, 140), (160, 160), (0, 255, 255), -1)
  15. cv2.imshow("Square", canvas) # 显示画布
  16. cv2.waitKey()
  17. cv2.destroyAllWindows()

展示:

4、绘制圆形

opencv  绘制线段为circle() 方法

4.1 函数介绍

函数如下:

4.2 实验代码

绘制红绿灯:
 

  1. import numpy as np # 导入Python中的numpy模块
  2. import cv2
  3. # np.zeros():创建了一个画布
  4. # (100, 300, 3):一个100 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
  5. # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
  6. canvas = np.zeros((100, 300, 3), np.uint8)
  7. # 在画布上,绘制一个圆心坐标为(50, 50),半径为40,红色的实心圆形
  8. canvas = cv2.circle(canvas, (50, 50), 40, (0, 0, 255), -1)
  9. # 在画布上,绘制一个圆心坐标为(150, 50),半径为40,黄色的实心圆形
  10. canvas = cv2.circle(canvas, (150, 50), 40, (0, 255, 255), -1)
  11. # 在画布上,绘制一个圆心坐标为(250, 50),半径为40,绿色的实心圆形
  12. canvas = cv2.circle(canvas, (250, 50), 40, (0, 255, 0), -1)
  13. cv2.imshow("TrafficLights", canvas) # 显示画布
  14. cv2.waitKey()
  15. cv2.destroyAllWindows()

绘制同心圆代码:

  1. import numpy as np # 导入Python中的numpy模块
  2. import cv2
  3. # np.zeros():创建了一个画布
  4. # (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
  5. # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
  6. canvas = np.zeros((300, 300, 3), np.uint8)
  7. # shape[1]表示画布的宽度,center_X表示圆心的横坐标
  8. # 圆心的横坐标等于画布的宽度的一半
  9. center_X = int(canvas.shape[1] / 2)
  10. # shape[0]表示画布的高度,center_X表示圆心的纵坐标
  11. # 圆心的纵坐标等于画布的高度的一半
  12. center_Y = int(canvas.shape[0] / 2)
  13. # r表示半径;其中,r的值分别为0、30、60、90和120
  14. for r in range(0, 150, 30):
  15. # 绘制一个圆心坐标为(center_X, center_Y),半径为r,绿色的,线条宽度为5的圆形
  16. cv2.circle(canvas, (center_X, center_Y), r, (0, 255, 0), 5)
  17. cv2.imshow("Circles", canvas) # 显示画布
  18. cv2.waitKey()
  19. cv2.destroyAllWindows()

绘制随机圆:

  1. import numpy as np # 导入Python中的numpy模块
  2. import cv2
  3. # np.zeros():创建了一个画布
  4. # (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
  5. # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
  6. canvas = np.zeros((300, 300, 3), np.uint8)
  7. # 通过循环绘制27个实心圆
  8. for numbers in range(0, 28):
  9. # 获得随机的圆心横坐标,这个横坐标在[0, 299]范围内取值
  10. center_X = np.random.randint(0, high = 300)
  11. # 获得随机的圆心纵坐标,这个纵坐标在[0, 299]范围内取值
  12. center_Y = np.random.randint(0, high = 300)
  13. # 获得随机的半径,这个半径在[11, 70]范围内取值
  14. radius = np.random.randint(11, high = 71)
  15. # 获得随机的线条颜色,这个颜色由3个在[0, 255]范围内的随机数组成的列表表示
  16. color = np.random.randint(0, high = 256, size = (3,)).tolist()
  17. # 绘制一个圆心坐标为(center_X, center_Y),半径为radius,颜色为color的实心圆形
  18. cv2.circle(canvas, (center_X, center_Y), radius, color, -1)
  19. cv2.imshow("Circles", canvas) # 显示画布
  20. cv2.waitKey()
  21. cv2.destroyAllWindows()

5、绘制多边形

opencv  绘制线段为ploylines() 方法

5.1 函数介绍

函数如下:

5.2 实验代码

代码:

  1. import numpy as np # 导入Python中的numpy模块
  2. import cv2
  3. # np.zeros():创建了一个画布
  4. # (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
  5. # np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8
  6. canvas = np.zeros((300, 300, 3), np.uint8)
  7. # 按顺时针给出等腰梯形4个顶点的坐标
  8. # 这4个顶点的坐标构成了一个大小等于“顶点个数 * 1 * 2”的数组
  9. # 这个数组的数据类型为np.int32
  10. pts = np.array([[100, 50], [200, 50], [250, 250], [50, 250]], np.int32)
  11. # 在画布上根据4个顶点的坐标,绘制一个闭合的,红色的,线条宽度为5的等腰梯形边框
  12. canvas = cv2.polylines(canvas, [pts], True, (0, 0, 255), 5)
  13. cv2.imshow("Polylines", canvas) # 显示画布
  14. cv2.waitKey()
  15. cv2.destroyAllWindows()

6、绘制动态图形

代码:

  1. import cv2
  2. import time
  3. import numpy as np
  4. width, height = 200, 200 # 画面的宽和高
  5. r = 20 # 圆半径
  6. x = r + 20 # 圆心和坐标起始坐标
  7. y = r + 100 # 圆形纵坐标起始坐标
  8. x_offer = y_offer = 4 # 每一帧的移动速度
  9. while cv2.waitKey(1) == -1: # 按下任何按键之后
  10. if x > width - r or x < r: # 如果圆的横坐标超出边界
  11. x_offer *= -1 # 横坐标速度取相反值
  12. if y > height - r or y < r: # 如果圆的纵坐标超出边界
  13. y_offer *= -1 # 纵坐标速度取相反值
  14. x += x_offer # 圆心按照横坐标速度移动
  15. y += y_offer # 圆心按照纵坐标速度移动
  16. img = np.ones((width, height, 3), np.uint8) * 255 # 绘制白色背景面板
  17. cv2.circle(img, (x, y), r, (255, 0, 0), -1) # 绘制圆形
  18. cv2.imshow("img", img) # 显示图像
  19. time.sleep(1 / 60) # 休眠1/60秒,也就是秒60帧
  20. cv2.destroyAllWindows() # 释放所有窗体

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/968584
推荐阅读
相关标签
  

闽ICP备14008679号