【OpenCV学习】绘制图形其二

🌈据说,看我文章时 关注、点赞、收藏帅哥美女们 心情都会不自觉的好起来。

前言:
🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~
✨个人主页:点我直达,在这里肯定能找到你想要的~
👍专栏介绍:OpenCV从入门到放弃 ,一个学习OpenCV的专栏~

专栏文章直链:
【OpenCV学习】绘制图形其一
【OpenCV学习】Mat数据结构与图像通道的分割与融合
【OpenCV学习】OpenCV的色彩空间
【OpenCV学习】初识OpenCV其二
【OpenCV学习】初识OpenCV人生苦短,我用python

画多边形

画多边形就是画很多直线(线段),所以画多边形会接收一个点集的集合,是个三维数组,如果你使用二维数组来绘画的画,就会出现如下的效果:

from cv2 import cv2
import numpy as np
# 创建纯黑的背景图用来画图形
img = np.zeros((480, 640, 3), np.uint8)
# polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None)
# polylines(图片, int32以上类型点集的集合(三维), 图形是否闭合, bgr颜色, 线宽, 线型(1/4/[8]/16), 坐标缩放比例)
pts = np.array([(320, 40), (20, 320), (620, 320)], np.int32)
cv2.polylines(img, pts, True, (0, 0, 255), 5)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

然后你会收获一个报错:

在这里插入图片描述

OpenCV(3.4.1) Error: Assertion failed (p.checkVector(2, 4) >= 0) in cv::polylines, file C:\projects\opencv-python\opencv\modules\imgproc\src\drawing.cpp, line 2441
Traceback (most recent call last):
  File "G:/opencvStudy/note/demo.py", line 18, in <module>
    cv2.polylines(img, pts, True, (0, 0, 255), 5)
cv2.error: OpenCV(3.4.1) C:\projects\opencv-python\opencv\modules\imgproc\src\drawing.cpp:2441: error: (-215) p.checkVector(2, 4) >= 0 in function cv::polylines

在当中捕获到了一个非常重要的判断:p.checkVector(2, 4) >= 0 ,这说明了什么?说明他检查维度必须是三维的,因为一个多边形,可以是由多组图形合体形成的,比如我下面这个小栗子:

from cv2 import cv2
import numpy as np
# 创建纯黑的背景图用来画图形
img = np.zeros((480, 640, 3), np.uint8)
# polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None)
# polylines(图片, int32以上类型点集的集合(三维), 图形是否闭合, bgr颜色, 线宽, 线型(1/4/[8]/16), 坐标缩放比例)
pts1 = np.array([(320, 40), (20, 320), (620, 320)], np.int32)
pts2 = np.array([(20, 140), (620, 140), (320, 420)], np.int32)
cv2.polylines(img, [pts1, pts2], True, (0, 0, 255), 5)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

就画出来了由两个三角形组成的六边形:

在这里插入图片描述

当中 isClosed 代表图形是否闭合,如果闭合的话,会首尾相连,否则会止步于最后一点。

填充多边形

因为是填充,所以必定会闭合图形,然后在封闭的图形中填充颜色。但他有个小小的要注意的地方,就拿填充上面六边形来说,如果你用画六边形的方法填充他,那你铁定获得了6个相连的填充三角形:

from cv2 import cv2
import numpy as np
# 创建纯黑的背景图用来画图形
img = np.zeros((480, 640, 3), np.uint8)
# fillPoly(img, pts, color, lineType=None, shift=None, offset=None)
# fillPoly(图片, int32以上类型点集的集合(三维), bgr颜色, 线型(1/4/[8]/16), 坐标缩放比例, 坐标偏移量(x, y))
pts1 = np.array([(320, 40), (20, 320), (620, 320)], np.int32)
pts2 = np.array([(20, 140), (620, 140), (320, 420)], np.int32)
cv2.fillPoly(img, [pts1, pts2], (0, 255, 0))
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果图:

在这里插入图片描述

那如何让他填充实体的六边形呢?答案也很简单,分开来填充~

from cv2 import cv2
import numpy as np
# 创建纯黑的背景图用来画图形
img = np.zeros((480, 640, 3), np.uint8)
# fillPoly(img, pts, color, lineType=None, shift=None, offset=None)
# fillPoly(图片, int32以上类型点集的集合(三维), bgr颜色, 线型(1/4/[8]/16), 坐标缩放比例, 坐标偏移(x, y))
pts1 = np.array([(320, 40), (20, 320), (620, 320)], np.int32)
pts2 = np.array([(20, 140), (620, 140), (320, 420)], np.int32)
cv2.fillPoly(img, [pts1], (0, 255, 0))
cv2.fillPoly(img, [pts2], (0, 255, 0))
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

这下就得到了整个正六边形的填充体了:

在这里插入图片描述

添加文字

字体格式:
在这里插入图片描述
方法说明看注释:

from cv2 import cv2
import numpy as np
# 创建纯黑的背景图用来画图形
img = np.zeros((480, 640, 3), np.uint8)
# putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
# putText(图片, 文字(英文), 左下角坐标, 字体格式, 字体大小, color, thickness=None, lineType=None, bottomLeftOrigin=None)
cv2.putText(img, 'OpenCV', (50, 150), cv2.FONT_HERSHEY_COMPLEX, 4, (0, 0, 255))
cv2.putText(img, '你好cv2!!', (50, 350), cv2.FONT_HERSHEY_COMPLEX, 4, (0, 0, 255))
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印结果,发现中文以及中文符号都变成问号了,只有英文和英文标点和数字能正常显示。可以看出OpenCV实际上是一点也不支持中文的,字体都是英文字体:
在这里插入图片描述

如何让图片上有中文?
这里有一种 “曲线救国” 的方式——使用 Pillow 库绘制中文。
实际上这里的绘制中文,跟OpenCV完全没有关系(毕竟我们不会大佬那种修改C++的方式)。

from cv2 import cv2
import numpy as np
from PIL import ImageFont, ImageDraw, Image
# 纯白
# img = np.full((617, 821, 3), 255, np.uint8)
# 读取背景图片
img = cv2.imread('./cat.jpeg')
# 导入字体文件
font = ImageFont.truetype('./113.ttf', 64)
# 创建一个pillow的图片
img_pil = Image.fromarray(img)
draw = ImageDraw.Draw(img_pil)
# 利用draw去绘制中文
draw.text((250, 300), '你好cv2!!', font=font, fill=(0, 0, 255))
# 重新变回ndarray
img = np.array(img_pil)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果图:

在这里插入图片描述

这下中文可以正常显示出来了,Nice!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用OpenCV绘制图形可以通过调用不同的函数来实现。在Python中,可以使用cv2.line()来绘制线段,cv2.rectangle()来绘制矩形,cv2.circle()来绘制圆形,cv2.ellipse()来绘制椭圆,cv2.polylines()来绘制多边形,以及cv2.putText()来绘制文本。这些函数可以在计算机视觉任务和图像处理中非常有用。例如,可以使用cv2.circle()函数绘制圆形。 在OpenCV中,绘制图形的步骤通常包括创建一个画布,并在其上使用相应的函数绘制所需的图形。通过指定参数如颜色、线条宽度和填充等,可以对图形进行进一步的定制。例如,可以指定圆心坐标、半径和颜色来绘制一个圆形。 下面是一个示例代码,展示了如何使用OpenCV绘制图形: #include <opencv2/opencv.hpp> using namespace cv; int main() { // 载入图片 Mat srcImage = imread("dota.jpg", 1); Mat dstImage; // 转换颜色空间 cvtColor(srcImage, dstImage, COLOR_BGR2Lab); // 显示效果图 imshow("效果图", dstImage); waitKey(0); } 这个示例代码使用了cv2的imread()函数来载入一张图片,然后使用cvtColor()函数将图片转换为Lab颜色空间。最后,使用imshow()函数显示转换后的效果图。 希望这个回答能够帮助您了解如何使用OpenCV绘制图形。如果还有其他问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【CV 向】OpenCV 图形绘制指南](https://blog.csdn.net/qq_21484461/article/details/131333236)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [OpenCV学习基本绘图](https://blog.csdn.net/qq_44859533/article/details/125160651)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值