Python Opencv 绘制图形详解(包含一个练习)——线/矩形/圆/多边形/文字

                         QQ:3020889729                                                                                 小蔡

才学习opencv没多久,本意是经验总结、积累和回顾,望大神/大佬勿怪~
末尾有一个图形绘制样例——算是一个小练习吧 点击前往

绘制线条

函数详解

线条绘制,将用到cv2.line()——每次调用绘制一条直线:由起止坐标组成

  • 参数一:图像——你要绘制到哪个图像上,就放入哪个图象(如:img = np.zeros((512, 512, 3), np.uint8) 中的 img,这是一张图片/当然你打开摄像头是也可以放入cv2.read返回的帧图像)
  • 参数二:开始坐标——为一个二元·元组(x, y)
  • 参数三:结束坐标——为一个二元·元组(x, y)
  • 参数四:color——采用RGB,三原色值,一个三元·元组
  • 参数五:线条大小——默认为1
  • 参数六:lineType——参数为:cv2.LINE_AA(抗锯齿线)----以及cv2.LINE_4和cv2.LINE_8
  • 参数七:shift ——偏移——默认为0,可以通过调节shift值实现缩小(由于坐标偏移导致的)和坐标偏移

代码实例

import cv2
import numpy as np

if __name__ == "__main__":
    img = np.zeros((512, 512, 3), np.uint8)  # 创建黑色图片
    cv2.namedWindow('imag', cv2.WINDOW_NORMAL)  # 创建可调节窗体
    cv2.resizeWindow('imag', 510, 510)  # 设置初始窗体大小

    cv2.line(img, (0, 0), (510, 510), (255, 0, 0), 5)  # 画蓝色背景线

    cv2.imshow('imag', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果:
在这里插入图片描述

绘制矩形

函数详解

矩形绘制,将用到cv2.rectangle()——每次调用绘制一个矩形:由一条对角线坐标组成

  • 参数一:图像——你要绘制到哪个图像上,就放入哪个图象(如:img = np.zeros((512, 512, 3), np.uint8) 中的 img,这是一张图片/当然你打开摄像头是也可以放入cv2.read返回的帧图像)
  • 参数二:左上角的坐标——为一个二元·元组(x, y)
  • 参数三:右小角的坐标——为一个二元·元组(x, y)
  • 参数四:color——采用RGB,三原色值,一个三元·元组
  • 参数五:线条大小——默认为1
  • 参数六:lineType——参数为:cv2.LINE_AA(抗锯齿线)----以及cv2.LINE_4和cv2.LINE_8
  • 参数七:shift ——偏移——默认为0,可以通过调节shift值实现缩小(由于坐标偏移导致的)和坐标偏移

代码实例

import cv2
import numpy as np

if __name__ == "__main__":
    img = np.zeros((512, 512, 3), np.uint8)  # 创建黑色图片
    cv2.namedWindow('imag', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('imag', 510, 510)

    cv2.rectangle(img, (215, 215), (295, 295), (0, 255, 0), 2)  # 画绿色矩形

    cv2.imshow('imag', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果:
在这里插入图片描述

绘制圆

函数详解

圆绘制,将用到cv2.circle()——每次调用绘制一个矩形:由一条对角线坐标组成

  • 参数一:图像——你要绘制到哪个图像上,就放入哪个图象(如:img = np.zeros((512, 512, 3), np.uint8) 中的 img,这是一张图片/当然你打开摄像头是也可以放入cv2.read返回的帧图像)
  • 参数二:圆心坐标——为一个二元·元组(x, y)
  • 参数三:半径大小
  • 参数四:color——采用RGB,三原色值,一个三元·元组
  • 参数五:线条大小——默认为1——在绘制图形时,如果设置为-1,则为图形填充
  • 参数六:lineType——线条类型——参数为:cv2.LINE_AA(抗锯齿线)----以及cv2.LINE_4和cv2.LINE_8
  • 参数七:shift ——偏移——默认为0,可以通过调节shift值实现缩小(由于坐标偏移导致的)和坐标偏移

代码实例

import cv2
import numpy as np

if __name__ == "__main__":
    img = np.zeros((512, 512, 3), np.uint8)  # 创建黑色图片
    cv2.namedWindow('imag', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('imag', 510, 510)

    cv2.circle(img, (255, 235), 30, (0, 0, 255), -1)  # 画红色圆

    cv2.imshow('imag', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果:
在这里插入图片描述

绘制文字

函数详解

文字绘制,将用到cv2.putText()——每次调用绘制一个矩形:由一条对角线坐标组成

  • 参数一:图像——你要绘制到哪个图像上,就放入哪个图象(如:img = np.zeros((512, 512, 3), np.uint8) 中的 img,这是一张图片/当然你打开摄像头是也可以放入cv2.read返回的帧图像)
  • 参数二:文字内容——为一个字符串
  • 参数三:文字绘制开始坐标——为一个二元·元组
  • 参数四:字体——由opencv中的字体确定——包含以下字体参数
  • ①cv2.FONT_HERSHEY_SIMPLEX ②cv.FONT_HERSHEY_PLAIN ③cv.FONT_HERSHEY_DUPLEX ④cv.FONT_HERSHEY_COMPLEX ⑤cv.FONT_HERSHEY_TRIPLEX ⑥cv.FONT_HERSHEY_COMPLEX_SMALL ⑦cv.FONT_HERSHEY_SCRIPT_SIMPLEX ⑧cv.FONT_HERSHEY_SCRIPT_COMPLEX ⑨cv.FONT_ITALIC
  • 参数五:字体大小
  • 参数六:color——颜色设置,RGB
  • 参数七:线条大小——默认为1
  • 参数八:lineType——线条类型——参数为:cv2.LINE_AA(抗锯齿线)----以及cv2.LINE_4和cv2.LINE_8
  • 参数九:上下颠倒——默认为False,不颠倒——输入True为颠倒

代码实例

import cv2
import numpy as np

if __name__ == "__main__":
    img = np.zeros((512, 512, 3), np.uint8)  # 创建黑色图片
    cv2.namedWindow('imag', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('imag', 510, 510)

    cv2.putText(img, 'I LOVE', (144, 190), cv2.FONT_HERSHEY_COMPLEX_SMALL, 3, (255, 255, 255), 2, cv2.LINE_AA)  
    # 白色文字

    cv2.imshow('imag', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果:
在这里插入图片描述
将翻转打开——
cv2.putText(img, ‘I LOVE’, (144, 190), cv2.FONT_HERSHEY_COMPLEX_SMALL, 3, (255, 255, 255), 2, cv2.LINE_AA, True)
在这里插入图片描述

★★★绘制多边形

函数详解

多边形绘制,将用到cv2.polylines()——每次调用绘制一个矩形:由一条对角线坐标组成

  • 参数一:图像——你要绘制到哪个图像上,就放入哪个图象(如:img = np.zeros((512, 512, 3), np.uint8) 中的 img,这是一张图片/当然你打开摄像头是也可以放入cv2.read返回的帧图像)
  • 参数二:[顶点数组]——传入一个array数组(后边单独说明如何创建!)
  • 参数三:是否闭合(首尾连接)——填入参数为True为首尾相连——如果是False的话就只是一条相继连接的折线,而不是多边形
  • 参数四:颜色color参数——RGB,元组
  • 参数五:线条大小——默认为1
  • 参数六:lineType——线条类型——参数为:cv2.LINE_AA(抗锯齿线)----以及cv2.LINE_4和cv2.LINE_8
  • 参数七:shift偏移——决定偏移位置,默认为零,无偏移——偏移会导致图形位和大小改变

说明一下顶点数组——采用numpy科学数据处理包之一的数组包创建的一个多维数组(矩阵),并且同时规定数据类型为numpy.int32
代码实例如下:

  • import numpy as np pts2 = np.array([[190, 340], [325, 340], [315,370], [200, 370]], np.int32) # 顶点数组
  • 这样就创建了5个顶点的array数组
  • 官网提示,要加一个矩阵形状控制——pts2 = pts2.reshape((-1, 1, 2)) # 手动设置多维数组形状
  • 形状格式化为:顶点数12的矩阵形状——而传入-1,代表全部顶点传入
  • 然后,我们才将这样的数组传入到多边形绘制的方法中!!!

补充:多边形/折线顶点设置规则

  • 采用逐个顶点点相连
  • 比如:假设顶点中,包含[0,0] [0,8] [8,8] [8,0]
  • 那么它的连接方式就是:[0,0]先连接[0,8], 然后[0,8]连接 [8,8],接着 [8,8]连接 [8,0]
  • 如果你的cv2.polylines()中,参数三为True,闭合——就会在最后实现[0,0]和 [8,0]的连接;否则绘制结束,不在连接!!!

代码实例

import cv2
import numpy as np

if __name__ == "__main__":
    img = np.zeros((512, 512, 3), np.uint8)
    cv2.namedWindow('imag', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('imag', 520, 520)

    pts2 = np.array([[190, 340], [325, 340], [315, 370], [200, 370]], np.int32)  # 顶点数组
    pts2 = pts2.reshape((-1, 1, 2))  # 多维数组形状
    cv2.polylines(img, [pts2], True, (0, 255, 255), 2, cv2.LINE_AA)  # 用于多线绘画——布尔型参数为True时,返回多边形;否则为依次连接这些点的一条折线

    cv2.imshow('imag', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果:
在这里插入图片描述
折线形式:也就是参数三位False时
cv2.polylines(img, [pts2], False, (0, 255, 255), 2, cv2.LINE_AA)
在这里插入图片描述

一个小练习(放手练练吧)

设计内容

  1. 先用两条对角线作为背景
  2. 接着绘制一个矩形框位于窗体中心位置附近
  3. 再画两个实体圆位于矩形框两边(略微靠上一点会好看些)
  4. 上面完成了之后,我们就可以使用我们的文字绘制,将我们的文字放置在窗体中心位置左右——如果是一句话,就放在矩形下方;两句或者多句就均匀放在矩形框上下(看你自己吧,目的是熟悉参数下的图形绘制)
  5. 最后,我们会绘制一个多边形,将我们的文字和矩形框包围——多边形形状可以自己选择,只要好看就好了——我这里采用五边形
  6. 其它补充——可以联系下其它小图形的绘制,丰富图像!!!

效果展示

略丑,请莫怪~
在这里插入图片描述

实现代码如下

import cv2
import numpy as np

if __name__ == "__main__":
    img = np.zeros((512, 512, 3), np.uint8)  # 创建黑色图片
    cv2.namedWindow('imag', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('imag', 510, 510)

    cv2.line(img, (0, 0), (510, 510), (255, 0, 0), 5)  # 画背景线
    cv2.line(img, (0, 510), (510, 0), (255, 0, 0), 5)

    cv2.rectangle(img, (215, 215), (295, 295), (0, 255, 0), 2)  # 画矩形
    cv2.circle(img, (195, 235), 30, (0, 0, 255), -1)  # 画圆
    cv2.circle(img, (315, 235), 30, (0, 0, 255), -1)  # 画圆

    pts = np.array([[260, 60], [80, 200], [100, 380], [420, 380], [440, 200]], np.int32)  # 顶点数组
    pts = pts.reshape((-1, 1, 2))  # 多维数组形状
    cv2.polylines(img, [pts], True, (0, 255, 255), 2, cv2.LINE_AA)  # 用于多线绘画——布尔型参数为True时,返回多边形;否则为依次连接这些点的一条折线

    pts2 = np.array([[190, 340], [325, 340], [315, 370], [200, 370]], np.int32)  # 顶点数组
    pts2 = pts2.reshape((-1, 1, 2))  # 多维数组形状
    cv2.polylines(img, [pts2], True, (0, 255, 255), 2, cv2.LINE_AA)  # 用于多线绘画——布尔型参数为True时,返回多边形;否则为依次连接这些点的一条折线

    cv2.putText(img, 'I LOVE', (144, 190), cv2.FONT_HERSHEY_COMPLEX_SMALL, 3, (255, 255, 255), 2, cv2.LINE_AA)
    cv2.putText(img, 'OpenCV', (87, 310), cv2.FONT_HERSHEY_COMPLEX_SMALL, 4, (255, 255, 255), 2, cv2.LINE_AA)

    cv2.imshow('imag', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

小案例总结

在使用opencv绘制图形时,和其它的GUI是一样的,都是对坐标进行处理——但是opencv的魅力在于,我们可以依托这样的绘制在后期的人脸识别以及其它的图像处理时,提供我们清晰的识别提示等帮助!!!
如:判别到人脸,在特征区附近实现矩形的绘制,通过图像反馈得出人脸检测的反馈提示~

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

NULL not error

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

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

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

打赏作者

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

抵扣说明:

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

余额充值