OpenCV-Python快速入门(十):绘图基础

前言

  • 本文是个人快速入门OpenCV-Python的电子笔记,由于水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入
    OpenCV-Python快速入门
    专栏或我的个人主页查看

前提条件

实验环境

  • Python 3.x (面向对象的高级语言)
  • OpenCV 4.0(python第三方库)pip3 install opencv-python

绘图基础

  • OpenCV 提供了绘制直线的函数 cv2.line()、绘制矩形的函数cv2.rectangle()、绘制圆的函数cv2.circle()、绘制椭圆的函数cv2.ellipse()、绘制多边形的函数 cv2.polylines()、在图像内添加文字的函数 cv2.putText()等多种绘图函数。

绘制直线

import cv2
import numpy as np
'''
img = cv2.line( img, pt1, pt2, color[, thickness[, lineType ]])
参数说明:
    img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
    pt1 表示线段的第 1 个点(起点)。
    pt2 表示线段的第 2 个点(终点)。
    color:绘制形状的颜色。通常使用 BGR 模型表示颜色,
        例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。
        需要注意,颜色通道的顺序是 BGR,而不是 RGB。
    thickness:线条的粗细。
        默认值是 1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
    lineType:线条的类型,默认是 8 连接类型。
'''
img = np.zeros((400,400,3), np.uint8)
img = cv2.line(img,(0,0),(400,200),(255,0,0),3)
img = cv2.line(img,(0,200),(400,200),(0,255,0),1)
img = cv2.line(img,(100,0),(200,400),(0,0,255),6)
cv2.namedWindow('cv2.line')
cv2.imshow('cv2.line', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

绘制矩形

import cv2
import numpy as np
'''
img = cv2.rectangle( img, pt1, pt2, color[, thickness[, lineType]] )
参数说明:
    img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
    pt1 为矩形顶点。
    pt2 为矩形中与 pt1 对角的顶点。
    color:绘制形状的颜色。通常使用 BGR 模型表示颜色,
        例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。
        需要注意,颜色通道的顺序是 BGR,而不是 RGB。
    thickness:线条的粗细。
        默认值是 1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
    lineType:线条的类型,默认是 8 连接类型。
'''
img = np.zeros((400,400,3), np.uint8)
img = cv2.rectangle(img,(100,100),(300,300),(0,0,255),-1)
cv2.namedWindow('cv2.rectangle')
cv2.imshow('cv2.rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

绘制圆形

import cv2
import numpy as np
'''
img = cv2.circle( img, center, radius, color[, thickness[, lineType]] )
参数说明:
    img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
    center 为圆心。
    radius 为半径。
    color:绘制形状的颜色。通常使用 BGR 模型表示颜色,
        例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。
        需要注意,颜色通道的顺序是 BGR,而不是 RGB。
    thickness:线条的粗细。
        默认值是 1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
    lineType:线条的类型,默认是 8 连接类型。
'''
img = np.zeros((400,400,3),dtype="uint8")
(centerX,centerY) = (round(img.shape[1] / 2),round(img.shape[0] / 2))
# 将图像的中心作为圆心,实际值为 400/2
for r in range(5,round(400/2),12):
    cv2.circle(img,(centerX,centerY),r,(255,255,255),3)
# circle(载体图像,圆心,半径,颜色)
cv2.imshow("cv2.circle",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

绘制椭圆

import cv2
import numpy as np
'''
img=cv2.ellipse(img, center, axes, angle, startAngle, endAngle, 
                color[,thickness[, lineType]])
参数说明:
    img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
    center 为椭圆的圆心坐标。
    axes 为轴的长度。
    angle 为偏转的角度。
    startAngle 为圆弧起始角的角度。
    endAngle 为圆弧终结角的角度。
    color:绘制形状的颜色。通常使用 BGR 模型表示颜色,
        例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。
        需要注意,颜色通道的顺序是 BGR,而不是 RGB。
    thickness:线条的粗细。
        默认值是 1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
    lineType:线条的类型,默认是 8 连接类型。
'''
img = np.zeros((400,400,3),dtype="uint8")
center=(round(400/2),round(400/2))
size=(100,200)
# 轴的长度
for i in range(0,5):
    # 偏移角度
    angle = np.random.randint(0,361)
    # 生成随机颜色,3 个[0,256)的随机数
    color = np.random.randint(0,high = 256,size = (3,)).tolist()
    # 随机粗细
    thickness = np.random.randint(1,9)
    cv2.ellipse(img, center, size, angle, 0, 360, color,thickness)
cv2.imshow("cv2.ellipse",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

绘制多边形

import cv2
import numpy as np
'''
img = cv2.polylines( img, pts, isClosed, color[, thickness[, lineType[, shift]]])
参数说明:
    img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
    pts 为多边形的各个顶点。
    isClosed 为闭合标记,用来指示多边形是否是封闭的。
        若该值为 True,则将最后一个点与第一个点连接,让多边形闭合;
        否则,仅仅将各个点依次连接起来,构成一条曲线。
    color:绘制形状的颜色。通常使用 BGR 模型表示颜色,
        例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。
        需要注意,颜色通道的顺序是 BGR,而不是 RGB。
    thickness:线条的粗细。
        默认值是 1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
    lineType:线条的类型,默认是 8 连接类型。
    注:需要给出每个顶点的坐标。这些点的坐标构建了
        一个大小等于“顶点个数*1*2”的数组,
        这个数组的数据类型必须为 numpy.int32。
'''
img = np.zeros((400,400,3),dtype="uint8")
# 生成各个顶点,注意数据类型为 int32
pts=np.array([[200,50],[300,200],[200,350],[100,200]], np.int32)
# 第 1 个参数为-1, 表明它未设置具体值,它所表示的维度值是通过其他参数值计算得到的
pts=pts.reshape((-1,1,2))
# # 调用函数 cv2.polylines()完成多边形绘图。注意,第 3 个参数控制多边形是否封闭
cv2.polylines(img,[pts],True,(255,255,255),8)
cv2.imshow("cv2.polylines",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

绘制文字

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
'''
img=cv2.putText(img, text, org, fontFace, fontScale, 
                color[, thickness[,lineType[, bottomLeftOrigin]]])
参数说明:
    img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
    text 为要绘制的字体。
    org 为绘制字体的位置,以文字的左下角为起点。
    fontFace 表示字体类型,其参数类型及含义。
    fontScale 表示字体大小。
    color:绘制形状的颜色。通常使用 BGR 模型表示颜色,
        例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。
        需要注意,颜色通道的顺序是 BGR,而不是 RGB。
    thickness:线条的粗细。
        默认值是 1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
    lineType:线条的类型,默认是 8 连接类型。
    bottomLeftOrigin 用于控制文字的方向。
        默认值为 False,当设置为 True 时,文字是垂直镜像的效果。

'''
img = np.zeros((400,400,3),dtype="uint8")
cv2.putText(img,'OpenCV',(20,150), cv2.FONT_HERSHEY_SIMPLEX, 3,(0,255,0),15)
cv2.putText(img,'OpenCV',(20,150), cv2.FONT_HERSHEY_SIMPLEX, 3,(0,0,255),5)
# 绘制中文
# 创建一个可以在给定图像上绘图的对象
img_np= Image.fromarray(img)
draw = ImageDraw.Draw(img_np)
# 字体的格式
fontStyle = ImageFont.truetype("simsun.ttc", size=64 ,encoding="utf-8")
# 绘制文本
draw.text((10, 250),"数字图像处理",(0, 255, 0),font=fontStyle)
img = np.array(img_np)
cv2.imshow("cv2.putText",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

参考文献

[1] https://opencv.org/
[2] 李立宗. OpenCV轻松入门:面向Python. 北京: 电子工业出版社,2019

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FriendshipT

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

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

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

打赏作者

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

抵扣说明:

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

余额充值