让我们使用 OpenCV 绘制 OpenCV 徽标
OpenCV 是一个很棒的、强大的图像处理、计算机视觉和深度学习库。说它是所有计算机视觉库之神并不是开玩笑。 在本文中,我们将了解 OpenCV 的图像绘制功能,以及如何使用它绘制自己的徽标。 先决条件 - 所有你需要 为了能够成功使用本教程,我们只需要安装 Python 和 OpenCV。 在这里,我们将使用pip来安装OpenCV,它直接安装了wheel文件,我们无需担心手动构建过程。我们当然
OpenCV 是一个很棒的、强大的图像处理、计算机视觉和深度学习库。说它是所有计算机视觉库之神并不是开玩笑。
在本文中,我们将了解 OpenCV 的图像绘制功能,以及如何使用它绘制自己的徽标。
先决条件 - 所有你需要
为了能够成功使用本教程,我们只需要安装 Python 和 OpenCV。
在这里,我们将使用pip
来安装OpenCV,它直接安装了wheel文件,我们无需担心手动构建过程。我们当然可以进行手动构建,但这本身需要单独编写(检查这个已经可用的很棒的指南)。
我们将在这个活动的虚拟环境中工作(考虑到我们已经安装了 python,如果没有,请检查这个)。要创建此环境,请在终端中执行以下步骤:
~ % mkdir opencv_logo_proj
~ % cd opencv_logo_proj
opencv_logo_proj ~ % python3 -m venv venv
进入全屏模式 退出全屏模式
如果我们注意到在目录中创建了一个名为venv
的文件夹,这将在我们的工作目录opencv_logo_proj
中创建一个虚拟环境。
要激活这个venv
,我们可以执行以下操作:
opencv_logo_proj ~ % source venv/bin/activate
(venv) opencv_logo_proj ~ %
进入全屏模式 退出全屏模式
终端中的(venv)
前缀表示该环境对我们进行工作是活动的。现在它之外的任何东西都不会受到影响,并且库只会安装在这个环境中。
所以继续前进,首先我们在 python 虚拟环境中升级 pip、setuptools 和 wheel 包(以避免任何不必要的错误)。
(venv) ~ % pip install --upgrade pip setuptools wheel
进入全屏模式 退出全屏模式
当您运行上述命令时,它会一次性升级 pip、setuptools 和 wheel。现在让我们安装 OpenCV。
(venv) ~ % pip install opencv-contrib-python
进入全屏模式 退出全屏模式
我们将安装 OpenCV 及其所有主要模块和贡献模块(这包含正在进行的工作,但主要是稳定版本)。
按下回车键后,您应该会看到如下内容:
Collecting opencv-contrib-python
Downloading opencv_contrib_python-4.5.1.48-cp38-cp38-macosx_10_13_x86_64.whl (51.3 MB)
|████████████████████████████████| 51.3 MB 7.5 MB/s
Collecting numpy>=1.17.3
Downloading numpy-1.20.2-cp38-cp38-macosx_10_9_x86_64.whl (16.0 MB)
|████████████████████████████████| 16.0 MB 3.9 MB/s
Installing collected packages: numpy, opencv-contrib-python
进入全屏模式 退出全屏模式
OpenCV 依赖于 NumPy,因此它也会安装它。如果您在 OpenCV 安装过程中遇到任何问题,请在评论中与我联系。
让我们继续有趣的部分。
OpenCV 徽标使用 OpenCV
我们的目标是绘制这个:
[](https://res.cloudinary.com/practicaldev/image/fetch/s--MwV2vj67--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode .com/res/hashnode/image/upload/v1618654038257/tM_8qo9Gt.jpeg)
让我们创建一个文件,将其命名为openCvSymbolDrawing.py
(或任何您喜欢的名称)。在其中添加以下代码行:
# ./opencv_logo_proj/openCvSynmbolDrawing.py
import cv2
import numpy as np
#output image
img = np.full((360, 512, 3), 255, dtype="uint8")
进入全屏模式 退出全屏模式
-
首先,我们导入所需的库,
import cv2
导入 OpenCV 计算机视觉库,import numpy as np
导入别名为np
的 numpy。 -
然后我们创建输出图像,我们将在其中绘制 OpenCV 徽标。 OpenCV 在后台使用 NumPy 并将图像视为 NumPy 数组。
这里要注意的重要一点是,尺寸(360, 512, 3)
是从图像的左上角开始测量的。所以,它从那个角向下(y轴)取了360
个点,从那个角落向右(x轴)取了512
个点,3
表示它是一个3维数组(也表示它是一个3通道图像,即- 蓝色、绿色、红色),顺便说一下,所有BGR
个图像都在 OpenCV 中(GRAY
个图像是二维的)。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--RjNddlIG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode .com/res/hashnode/image/upload/v1618654060529/soDMBbC66.png)
现在,cv2
中有几个绘图实用程序可以帮助我们实现预期的结果。在这里,我们将查看ellipse
表格来绘制徽标。在文件中添加以下代码:
# ./opencv_logo_proj/openCvSynmbolDrawing.py
img = cv2.ellipse(img, (256, 80), (60,60), 120,0,300,(0,0,255),-1)
img = cv2.ellipse(img, (256, 80), (20,20), 120,0,300,(255,255,255),-1)
img = cv2.ellipse(img, (176, 200), (60,60), 0,0,300,(0,255,0),-1)
img = cv2.ellipse(img, (176, 200), (20,20), 0,0,300,(255,255,255),-1)
img = cv2.ellipse(img, (336, 200), (60,60), 300,0,300,(255,0,0),-1)
img = cv2.ellipse(img, (336, 200), (20,20), 300,0,300,(255,255,255),-1)
font = cv2.FONT_HERSHEY_SIMPLEX
img = cv2.putText(img, "OpenCV", (196,296), font, 1, (0,0,0), 4, cv2.LINE_AA)
进入全屏模式 退出全屏模式
- 我们使用
cv2.ellipse
在图像img
上绘制一个椭圆。它需要在其上绘制的图像名称img
,表示椭圆中心的中心坐标(256, 80)
,表示椭圆的长轴和短轴的轴长(60, 60)
,旋转角度椭圆需要旋转120
度,开始角度0
度,结束角度300
度,颜色椭圆使用(0, 0, 255)
表示红色椭圆,最后一个参数是厚度,当设置为-1
时,用给定的颜色填充图形。这将形成一个椭圆,如下所示:
[](https://res.cloudinary.com/practicaldev/image/fetch/s--AOAa1Ua_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode .com/res/hashnode/image/upload/v1618654081997/eIvDEt6VP.png)
img = cv2.ellipse(img, (256, 80), (20,20), 120,0,300,(255,255,255),-1)
此语句创建一个同心椭圆来填充白色以获得所需的形状。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--aTogX-xz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn .hashnode.com/res/hashnode/image/upload/v1618654095759/t65ELz9TH.png)
- 同样,接下来的几个语句创建了具有所需形状的绿色和蓝色椭圆。
img = cv2.ellipse(img, (176, 200), (60,60), 0,0,300,(0,255,0),-1)
img = cv2.ellipse(img, (176, 200), (20,20), 0,0,300,(255,255,255),-1)
进入全屏模式 退出全屏模式
我们得到一个绿色椭圆标志。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--g9gbaemf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode .com/res/hashnode/image/upload/v1618654129100/oAnxcrzE4.png)
img = cv2.ellipse(img, (336, 200), (60,60), 300,0,300,(255,0,0),-1)
img = cv2.ellipse(img, (336, 200), (20,20), 300,0,300,(255,255,255),-1)
进入全屏模式 退出全屏模式
最后,我们绘制了一个蓝色椭圆标志。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--FejhfVX4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode .com/res/hashnode/image/upload/v1618654142324/ChVxxNc1A.png)
-
接下来,我们可以根据需要添加更多信息,例如文本。在这里,我们设置了一个字体为
font = cv2.FONT_HERSHEY_SIMPLEX
的好时单纯形字体,我们可以使用它来设置文本的样式。 -
img = cv2.putText(img, "OpenCV", (196,296), font, 1, (0,0,0), 4, cv2.LINE_AA)
这会将文本放在图像上并采用以下参数,图像需要将文本放在img
上的位置,文本OpenCV
,文本左下角坐标的位置(196,296)
,我们之前定义的字体样式font
,字体比例1
,颜色文本(0,0,0)
,粗细4
和最后的线类型cv2.LINE_AA
(它是可选的,我们也可以跳过这个)。
现在,我们显示最终结果并保存输出,将以下代码添加到文件中:
# ./opencv_logo_proj/openCvSynmbolDrawing.py
cv2.imshow("OpenCV Logo", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('opencvlogo.png', img)
进入全屏模式 退出全屏模式
-
我们使用
cv2.imshow
方法输出图像以供显示,但简单地说imshow
意味着它将显示该图像几毫秒并完成程序并退出终端。我们不希望这样,我们需要能够看到图像只要我们想要,对吧? -
使用
cv2.waitKey
接受一个参数,比如0
,让系统知道等待某个按键直到它退出进程。通过给出0
作为值,这意味着任何按键都会继续程序并退出进程。要清除显示输出,我们需要在使用cv2.waitKey(0)
后显式使用cv2.destroyAllWindows()
以让系统知道要清除输出。 -
最后,我们使用
cv2.imwrite('opencvlogo.png', img)
保存结果,它获取图像文件名和要保存的图像。
最终输出如下所示:
[](https://res.cloudinary.com/practicaldev/image/fetch/s--sxc29aDq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode .com/res/hashnode/image/upload/v1618654175386/6KpX54oVc.png)
结论,已经?
是的,就是这样。我们能够绘制一个几乎(我会说 99%)与实际徽标相似的符号。我希望您喜欢使用像 OpenCV 这样功能强大且易于使用的库的过程。
这是我在大学时代所做的一项有趣的活动。希望这会激发您追求并进一步研究计算机视觉和图像处理的能力。
如果您需要更多类似计算机视觉的有趣活动,请不要忘记查看OpenCV-Python-Computer-Vision。
-
刚刚开始您的开源之旅?不要忘记检查Hello Open Source
-
需要灵感或对 Python 项目有不同的看法,或者只是在那里探索?检查Awesome Python Repos
-
想从零开始制作一款简单又棒的游戏吗?查看乒乓球
-
想要
++
你的 GitHub Profile README?查看报价 - 自述文件
直到下一次!
纳马斯特🙏
更多推荐
所有评论(0)