Python中使用argparse处理命令行图片路径与形状计数
本文介绍如何在Python中使用argparse库解析命令行参数,实现动态指定输入与输出图片路径。结合OpenCV进行灰度转换、高斯模糊及阈值处理,提取图像轮廓并统计形状数量,最终将结果写入指定路径。
命令行参数基础
命令行参数是什么?
命令行参数是程序或脚本在运行时接收的标志。它们为程序提供额外的信息,使其能够执行特定的任务。
并非所有程序都依赖命令行参数,因为许多程序并不需要这种交互方式。
为什么要使用命令行参数?
如前所述,命令行参数允许在运行时向程序传递额外信息。
这使得我们无需修改源代码,即可动态地为程序提供不同的输入数据。
可以将命令行参数类比为函数参数。如果你熟悉在各类编程语言中声明和调用函数,那么掌握命令行参数的使用将非常容易上手。
鉴于本文涉及计算机视觉和图像处理,文中演示的参数主要涉及图像或视频文件的路径。
使用argparse解析路径
接下来,我们将创建一个名为shape_counter.py的新文件并开始编写代码。

在第2行,我们导入argparse模块,这是用于解析和访问命令行参数的核心库。
随后,在第7至12行代码中,我们定义了两个命令行参数。这段代码结构清晰,展示了参数的格式化方式。
这里以-input参数为例进行说明。
在第7行,我们实例化ArgumentParser对象,并将其赋值给变量ap。
接着在第8行和第9行,我们添加-input参数。必须同时指定简写形式(-i)和长写形式(--input),用户在命令行中可使用任一标志。通过设置required=True,该参数变为必需项。此外,help字符串会在终端中提供额外的提示信息。
类似地,在第10行和第11行,我们定义了另一个必需参数,用于指定输出路径。
获取参数后,我们利用路径加载图像。请注意,输入图像的路径存储在args["input"]中,随后将其作为参数传递给cv2.imread函数。
这个过程是否简单?
图像处理与轮廓提取
其余代码行主要涉及图像处理的具体操作:
在第18至20行,我们执行了三个关键步骤:
将图像转换为灰度模式。
对灰度图像进行高斯模糊处理。
对模糊后的图像应用阈值处理。
现在,我们准备查找并绘制形状的轮廓:

在第23至25行,我们在阈值图像中提取形状轮廓。
随后,我们在原始输入图像上绘制这些轮廓(见第28和29行)。
接着,我们在图像上添加并显示文本(第32至34行)。该文本包含检测到的形状总数。
最后,我们利用之前定义的--output参数,通过cv2.imwrite函数将处理后的图像保存到磁盘(第37行)。
让我们使用两个参数执行该命令:

以下是完整代码示例。
完整代码实现
Codeblock #1: Lines 1-20# import the necessary packages
import argparse
import imutils
import cv2
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input", required=True,
help="path to input image")
ap.add_argument("-o", "--output", required=True,
help="path to output image")
args = vars(ap.parse_args())
# load the input image from disk
image = cv2.imread(args["input"])
# convert the image to grayscale, blur it, and threshold it
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)[1]
# extract contours from the image
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]
# loop over the contours and draw them on the input image
for c in cnts:
cv2.drawContours(image, [c], -1, (0, 0, 255), 2)
# display the total number of shapes on the image
text = "I found {} total shapes".format(len(cnts))
cv2.putText(image, text, (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
(0, 0, 255), 2)
# write the output image to disk
cv2.imwrite(args["output"], image)
$ python shape_counter.py --input input_01.png --output output_01.png
以上就是Python中使用argparse处理命令行图片路径及形状计数的完整教程,希望能对大家有所帮助,欢迎继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













