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

我们的目标是绘制这个:

[opencvlogoorig.jpg](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个图像是二维的)。

[xyaxis.png](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时,用给定的颜色填充图形。这将形成一个椭圆,如下所示:

[img1.png](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)此语句创建一个同心椭圆来填充白色以获得所需的形状。

[img2.png](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)

进入全屏模式 退出全屏模式

我们得到一个绿色椭圆标志。

[img3.png](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)

进入全屏模式 退出全屏模式

最后,我们绘制了一个蓝色椭圆标志。

[img4.png](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)保存结果,它获取图像文件名和要保存的图像。

最终输出如下所示:

[opencvlogo.png](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?查看报价 - 自述文件

直到下一次!

纳马斯特🙏

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐