学习OpenCV的过程中,画图是不可避免的,本篇文章旨在介绍OpenCV中与画图相关的基础函数。
介绍:
cv2.line(image, start_point, end_point, color, thickness)
参数:
举例说明:
# 画线条
import cv2
import numpy as np
img = np.zeros((480, 640, 3),np.uint8)
cv2.line(img,(0,20),(200,380),(0,255,0),5)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果:
介绍:
cv2.line(image, center, radius, color, thickness)
参数:
举例说明:
# 画圆
import cv2
import numpy as npcv2.circle(img,(240, 250),100,(0,255,0),5)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
介绍
:
cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift )
参数:
举例说明:
# 画矩形
import cv2
import numpy as npcv2.rectangle(img,(80, 100),(380, 380),(0,0,255),10,180)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
介绍:
cv2.ellipse(img, center, axes, rotateAngle, startAngle, endAngle, color, thickness, lineType, shift)
参数:
OpenCV中原点在左上角,所以这里的角度是以顺时针方向计算的
举例说明:
# 画椭圆
import cv2
import numpy as npcv2.ellipse(img,(320, 240),(100, 50),0,0,360, (255, 0, 0))
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
介绍:
cv2.polylines(img, pts, isClosed, color, thickness, lineType, shift)
参数:
pts:多边形各边的坐标点组成的一个列表,是一个numpy的数组类型。这里需要是三维的。
isClosed:值为True或False,若为True则表示一个闭合的多边形,若为False则不闭合
举例说明:
# 画多边形(三边形)
import cv2
import numpy as np
pts = np.array([[[300, 10], [150, 100], [450, 100]]], np.int32)
# pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.uint8)
cv2.polylines(img,pts=pts, isClosed=True, color=(255, 0, 0), thickness=5)
# cv2.polylines(img,pts=pts,isClosed=True, color=(255, 255, 255), thickness=3)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
opencv中除了提供绘制各种图形的函数外,还提供了一个特殊的绘制函数——在图像上绘制文字。这个函数即是cv2.putText()。
介绍:
cv2.putText(img, text, pos, fontFace,fontScale,color[, thickness[, lineType[, bottomLeftOrigin]]])
参数:
左下角坐标
,(x, y)格式的元组。fontFace
值说明:
值 | 描述 |
---|---|
cv.FONT_HERSHEY_SIMPLEX | 表示正常大小无衬线字体。 |
cv.FONT_HERSHEY_PLAIN | 表示小号无衬线字体。 |
cv.FONT_HERSHEY_DUPLEX | 表示正常大小无衬线字体,比FONT_HERSHEY_SIMPLEX更复杂。 |
cv.FONT_HERSHEY_COMPLEX | 表示正常大小有衬线字体。 |
cv.FONT_HERSHEY_TRIPLEX | 表示正常大小有衬线字体,比FONT_HERSHEY_COMPLEX更复杂。 |
cv.FONT_HERSHEY_COMPLEX_SMALL | 表示FONT_HERSHEY_COMPLEX的小译本。 |
cv.FONT_HERSHEY_SCRIPT_SIMPLEX | 表示手写风格字体。 |
cv.FONT_HERSHEY_SCRIPT_COMPLEX | 表示手写风格字体,比FONT_HERSHEY_SCRIPT_SIMPLEX更复杂。 |
cv.FONT_ITALIC | 表示相应字体的斜体字。 |
lineType
值说明:
值 | 描述 |
---|---|
cv.LINE_4 | 表示 4 邻接线型。 |
cv.LINE_8 | 表示 8 邻接线型。 |
cv.LINE_AA | 表示抗锯齿线型,图像更平滑。 |
注意:OpenCV 不支持显示中文字符,使用 cv.putText() 时添加的文本字符串不能包含中文字符(包括中文标点符号)!!!
举例说明:
# 绘制文本cv2.putText(img, 'HELLO', (80, 200), cv2.FONT_HERSHEY_COMPLEX, 3, (0, 0, 255))
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
这里的一条绿色的线是之前使用line函数画的一条线。
绘制中文的话需要使用我们电脑上自带的字体。一般字体都在C:\Windows\Fonts
目录下,我们可以挑选一个自己想要展示的字体,然后使用ImageFont模块里面的truetype函数进行加载使用。
介绍ImageFont模块中的truetype函数:
ImageFont.truetype(filename , wordsize)
参数说明:
这个函数创建字体对象给ImageDraw中的text函数使用。
介绍ImageDraw模块中的Draw函数:
ImageDraw.Draw(image)
说明:
创建一个可用来对image进行操作的对象。对所有即将使用ImageDraw中操作的图片都要先进行这个对象的创建。
介绍Image模块中的fromarray函数:
Image.fromarray(np.uint8(img))
说明:
将array转换成image。
详细查看:numpy与image互转,numpy和tensor互转 (np.array,Image.fromarray ,a.numpy, torch.from_numpy)
举例说明:
# 绘制中文
import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image
img = np.full((500, 200, 3), fill_value = 255, dtype = np.uint8)
font = ImageFont.truetype(r'C:\Windows\Fonts\微软雅黑\msyh.ttc', 15)
img_pil = Image.fromarray(img)
draw = ImageDraw.Draw(img_pil)
draw.text((100, 150), '你好', font=font, fill=(0, 255, 0, 0))
img = np.array(img_pil)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
女神节了,博主在此祝各路程序媛,女神节快乐~
✨原创不易,还希望各位大佬支持一下\textcolor{blue}{原创不易,还希望各位大佬支持一下}原创不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力!\textcolor{green}{点赞,你的认可是我创作的动力!}点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!\textcolor{green}{收藏,你的青睐是我努力的方向!}收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!\textcolor{green}{评论,你的意见是我进步的财富!}评论,你的意见是我进步的财富!