基于Python的Opencv入门教程第二大部分(P1.识别物体的前置工作)
书接上文(doge)
计算对象
现在,我们将改变方向,开始编写另外一个图片的相关程序。
在接下来的几节中,我们将学习如何使用创建一个简单的Python+OpenCV脚本来计算下图中俄罗斯方块的数量:

一路上,我们将:
学习如何使用OpenCV将图像转换为灰度
执行边缘检测
灰度图像阈值化
查找、计数和绘制等高线
传导侵蚀和膨胀
掩蔽图像
继续并关闭下载的第一个脚本,然后打开opencv_tutorial_02.py开始第二个示例:
在第3-5行,我们导入我们的包。这在每个Python脚本开始时都是必需的。对于第二个脚本,我导入了argparse—一个命令行参数解析包,它是所有Python安装都附带的。(就是不需要额外安装的)
快速浏览第8-11行。这些行允许我们在运行时从终端内部向程序提供附加信息。命令行参数在PyImageSearch博客和所有其他计算机科学领域中都大量使用。
我鼓励您在本文中阅读它们:Python、argparse和命令行参数。
(以下是“Python、argparse和命令行参数”所指的网址:https://pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/?_ga=2.27194741.919642978.1642226886-1706104520.1639213599)
我们有一个必需的命令行参数--image,如第9行和第10行所定义的。
下面我们将学习如何使用所需的命令行参数运行脚本。现在,只要知道在脚本中遇到args[“image”]时,我们指的是输入图像的路径。
转换图片的灰度
我们将图像加载到第14行的内存中。将参数设置为CV2。imread函数是包含在args字典中的路径,该字典由“image”键args[“image”]引用。
从那里,我们显示图像,直到遇到第一个按键(第15行和第16行)。
我们将很快对图像中的边缘进行阈值化和检测。因此,我们在第19行通过调用CV2将图像转换为灰度。cvtColor并提供图像和CV2。颜色为灰旗。
我们再次显示图像并等待按键(第20行和第21行)。

转换为灰度的结果如下图所示。(上图为还未经过处理的原图)

边缘检测
边缘检测对于在图像中查找对象的边界非常有用-它对于分割非常有效。
让我们执行边缘检测,以了解该过程是如何工作的:
使用流行的Canny算法(由John F.Canny于1986年开发),我们可以找到图像中的边缘。
我们为CV2提供了三个参数。Canny函数:
img:灰色图像。
minVal:最小阈值,在我们的例子中是30。
maxVal:最大阈值,在我们的示例中为150。
aperture_size(孔径大小):Sobel内核大小。默认情况下,该值为3,因此不会显示在第24行。
最小和最大阈值的不同值将返回不同的边贴图。
在下图中,请注意俄罗斯方块的边缘是如何与组成俄罗斯方块的子方块一起显示的:

阈值
图像阈值处理是图像处理流程中的一个重要中间步骤。阈值化可以帮助我们去除图像中较亮或较暗的区域和轮廓。
我强烈建议您尝试阈值设置。我通过尝试和错误(以及经验)调整了以下代码以适用于我们的示例:
在一行(第29行)中,我们是:
抓取灰度图像中大于225的所有像素,并将其设置为0(黑色),这与图像的背景相对应
将像素值设置为小于225到255(白色),对应于图像的前景(即俄罗斯方块自身)。
有关CV2的更多信息。阈值函数,包括阈值标志如何工作,请务必参考官方OpenCV文档。
用二值图像分割前景和背景是找到轮廓的关键(我们的下一步)。

请注意,在上图中,前景对象为白色,背景为黑色。

备注
阈值 [ yù zhí ]:
阈值又叫临界值,是指一个效应能够产生的最低值或最高值。
注意:这个程序与普通的程序运行的方式不同,不能直接使用Pycharm的Run键运行,也不能在终端中直接使用 python 文件名.py 运行,不然会报错!!!
运行代码如下:(要在终端打开程序所在我文件夹才能打开)

还有,一定要先配置好你的虚拟环境!!!不然会一直报错。(预计之后会出一个教程)
挖坑ing(doge)