OpenCV——第三章(图形的绘制)

1.线段的绘制

line()方法的语法格式如下:
img = cv2.line(img, pt1, pt2, color, thickness)
# 参数说明
# img:画布
# pt1: 线段的起点坐标
# pt2: 线段的终点坐标
# color:线条颜色
# thickness: 线条宽度

接下来我们使用该方法绘制一个图形吧!!!

import numpy as np 
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) # 黑色背景
# canvas = np.ones((300, 300, 3), np.uint8) * 255 # 白色背景


# 在画布上,绘制一条起点坐标为(50, 50)、终点坐标为(250, 50),蓝色的,线条宽度为10的线段
canvas = cv2.line(canvas, (50, 50), (250, 50), (255, 0, 0), 10)
# 在画布上,绘制一条起点坐标为(150, 50)、终点坐标为(150, 250),黄色的,线条宽度为5的线段
canvas = cv2.line(canvas, (150, 50), (150, 250), (0, 255, 255), 5)
# 在画布上,绘制一条起点坐标为(150, 150)、终点坐标为(190, 190),红色的,线条宽度为5的线段
canvas = cv2.line(canvas, (150, 150), (190, 190), (0, 0, 255), 5)
cv2.imshow("Lines", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

2.矩形的绘制

2.1 矩形

# rectangle()方法
# img = cv2.rectangle(img, pt1, pt2, color, thickness)
# img:画布
# pt1:左上角坐标
# pt2:右下角坐标
# color: 颜色
# thinckness: 线条宽度

 下面是一个绘制矩形边框的实例

import numpy as np 
import cv2

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 
import cv2

canvas = np.zeros((300, 300, 3), np.uint8)
canvas = cv2.rectangle(canvas, (50, 50), (200, 150), (255, 25, 0), -1)
cv2.imshow("Rectangle", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

2.2 正方形

实例如下:

import numpy as np 
import cv2

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, 155, 255), -1)
cv2.imshow("Square", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

3.圆形的绘制

3.1 实心圆

circle()方法的语法格式如下:

img = cv2.circle(img, center, radius, color, thickness)

# center:圆心坐标

# radius:半径

实现代码如下:

import numpy as np 
import cv2


canvas = np.zeros((100, 300, 3), np.uint8)
# 在画布上,绘制一个圆心坐标为(50, 50),半径为40的实心圆形
canvas = cv2.circle(canvas, (50, 50), 40, (0, 255, 255), -1)
# 在画布上,绘制一个圆心坐标为(150, 50),半径为40的实心圆形
canvas = cv2.circle(canvas, (150, 50), 40, (85, 125, 255), -1)
# 在画布上,绘制一个圆心坐标为(250, 50),半径为40的实心圆形
canvas = cv2.circle(canvas, (250, 50), 40, (50, 125, 200), -1)
cv2.imshow("TrafficLights", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

3.2 同心圆

import numpy as np 
import cv2


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): # [0, 150), 步长30
    # 绘制一个圆心坐标为(center_X, center_Y),半径为r,绿色的,线条宽度为5的圆形
    cv2.circle(canvas, (center_X, center_Y), r, (90, 125, 90), 5)
cv2.imshow("Circles", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

3.3 随机实心圆

import numpy as np 
import cv2


canvas = np.zeros((300, 300, 3), np.uint8)
# 通过循环绘制100个实心圆
for numbers in range(0, 101):
    # 获得随机的圆心横坐标,这个横坐标在[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()

4.多边形的绘制

多边形绘制的polylines()方法语法结构如下:

img = cv2.polylines(img, pts, isClosed, color, thickness)

# pts:由多边形各个顶点坐标组成的数组

# isClosed: 如果值为True, 表示一个闭合的多边形;如果为False, 表示一个不闭合的多边形

实例如下:

import numpy as np 
import cv2


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)

canvas = cv2.polylines(canvas, [pts], True, (0, 255, 255), 5)
cv2.imshow("Polylines", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

 

5.文字的绘制

OpenCV提供了putText()方法实现对文字的绘制, 该方法的语法格式如下:

 img = cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)

# text: 要绘制的文字内容

# org: 文字在画布中的左下角坐标

# fontFace: 字体样式

# fontScale: 字体大小

# lineType: 线型(默认值为8)

# bottomLeftOrigin: 绘制文字的方向(默认值为False)

 下面的可以使用的一些字体样式:

  1. cv2.FONT_HERSHEY_SIMPLEX: 普通的无衬线字体
  2. cv2.FONT_HERSHEY_PLAIN: 更细的无衬线字体
  3. cv2.FONT_HERSHEY_DUPLEX: 具有一些粗细的无衬线字体
  4. cv2.FONT_HERSHEY_COMPLEX: 复杂的无衬线字体
  5. cv2.FONT_HERSHEY_TRIPLEX: 更复杂的无衬线字体
  6. cv2.FONT_HERSHEY_COMPLEX_SMALL: 小号复杂的无衬线字体
  7. cv2.FONT_HERSHEY_SCRIPT_SIMPLEX: 手写风格字体
  8. cv2.FONT_HERSHEY_SCRIPT_COMPLEX: 更复杂的手写风格字体
import numpy as np 
import cv2


canvas = np.zeros((100, 160, 3), np.uint8)
# 在画布上绘制文字“dmsj”,文字左下角的坐标为(20, 70)
# 字体样式为FONT_HERSHEY_TRIPLEX
# 字体大小为2,线条颜色是绿色,线条宽度为5
cv2.putText(canvas, "dmsj", (20, 70), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 2, (0, 255, 0), 5)
cv2.imshow("Text", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

 

大家可以修改示例代码体验不同的字体样式(该方法不可以显示中文)

5.1 斜体效果

FONT_ITALIC可以与其他文字类型一起使用

import numpy as np 
import cv2

canvas = np.zeros((100, 300, 3), np.uint8)
# 字体样式为FONT_HERSHEY_TRIPLEX和FONT_ITALIC
fontStyle = cv2.FONT_HERSHEY_TRIPLEX + cv2.FONT_ITALIC

cv2.putText(canvas, "dmsj", (20, 70), fontStyle, 2, (0, 255, 0), 5)
cv2.imshow("Text", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

 

5.2 垂直镜像效果

bottomLeftQrigin值为True时,文字将体现垂直镜像效果

import numpy as np 
import cv2


canvas = np.zeros((200, 300, 3), np.uint8)

fontStyle = cv2.FONT_HERSHEY_TRIPLEX

cv2.putText(canvas, "dmsj", (20, 70), fontStyle, 2, (0, 255, 0), 5)
# 使文字“dmsj”呈现垂直镜像效果,这时lineType和bottomLeftOrigin变成了必须参数
# 其中,lineType取默认值8,bottomLeftOrigin的值为True
cv2.putText(canvas, "dmsj", (20, 100), fontStyle, 2, (0, 255, 0), 5, 8, True)
cv2.imshow("Text", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

5.3 图像上绘制文字

import cv2

image = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(1).jpg")

fontStyle = cv2.FONT_HERSHEY_TRIPLEX

cv2.putText(image, "pig", (20, 90), fontStyle, 1, (0, 0, 255))
cv2.imshow("Text", image) 
cv2.waitKey()
cv2.destroyAllWindows()

6.动态绘制图形

import cv2
import time
import numpy as np

width, height = 400, 400  # 画面的宽和高
r = 20  # 正方形边长的一半
x = r + 20  # 正方形起始横坐标
y = r + 100  # 正方形起始纵坐标
x_offer = y_offer = 4  # 每一帧的移动速度

while True:  # 持续循环直到按下按键
    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  # 绘制白色背景面板
    
    # 绘制红色实心正方形
    top_left = (int(x - r), int(y - r))
    bottom_right = (int(x + r), int(y + r))
    cv2.rectangle(img, top_left, bottom_right, (155, 0, 150), -1)
    
    
    cv2.imshow("img", img)  # 显示图像

    if cv2.waitKey(1) != -1:  # 如果按下任何键
        break  # 退出循环 

cv2.destroyAllWindows()  # 释放所有窗体

 

屏幕录制 2024-08-24 105247

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一款非常强大的计算机视觉库,其中包含了很多功能强大的图像处理和计算机视觉算法。而在这个系列的第三篇文章中,我们将重点介绍如何在OpenCV绘制图形和文本。 OpenCV绘制图形的函数包括cv2.line(直线),cv2.rectangle(矩形),cv2.circle(圆),cv2.ellipse(椭圆)和cv2.putText(文本)。这些函数的使用非常简单,只需要指定图像,开始点和结束点(或中心点和半径),颜色和线宽即可。 例如,我们可以使用cv2.rectangle函数在图像上绘制一个矩形: ``` import cv2 import numpy as np img = np.zeros((512,512,3), np.uint8) # 创建一个黑色的图像 cv2.rectangle(img,(384,0),(510,128),(0,255,0),3) # 绘制矩形 cv2.imshow("image",img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们首先创建了一个512x512的黑色图像,然后使用cv2.rectangle函数在图像上绘制了一个矩形,并将其显示出来。在这里,矩形的左上角坐标是(384,0),右下角坐标是(510,128),颜色是绿色(0,255,0),线宽为3。 除了绘制图形,我们也可以使用cv2.putText函数在图像上绘制文本。这个函数的使用也非常简单,只需要指定图像,文本内容,位置,字体,字体大小和颜色即可。 例如,我们可以使用cv2.putText函数在图像上写入一个“Hello World!”的文本: ``` import cv2 import numpy as np img = np.zeros((512,512,3), np.uint8) # 创建一个黑色的图像 font = cv2.FONT_HERSHEY_SIMPLEX # 设置字体 cv2.putText(img,'Hello World!',(10,500), font, 1,(255,255,255),2,cv2.LINE_AA) # 绘制文本 cv2.imshow("image",img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们使用cv2.putText函数在左下角绘制了一个“Hello World!”的文本,并将其显示出来。在这里,我们首先选取了字体类型为cv2.FONT_HERSHEY_SIMPLEX,然后指定了文本的位置(10,500),字体大小为1,颜色为白色(255,255,255),线宽为2,并且使用了cv2.LINE_AA参数,以实现更好的文本渲染效果。 综上所述,OpenCV中可以很方便地对图像进行绘制和文本处理,这对于图像处理和计算机视觉应用来说是非常重要的一步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值