最近在学习图像处理相关内容,也在github上尝试过不少代码,刚开始不明白别人写的代码中读取图片的代码到底如何运行的,比如:
img = cv2.imread(sys.argv[1])
但自己运行(在pycharm中运行的)立马报错列表索引超出范围:
这个问题困扰了我很久,查了很多资料也看不懂(还是自己太菜了),以至于后来只要看到有sys.argv[ ]的代码直接劝退。。。但最近又卡在这个问题上,不跨过这个坎不行了,下定决心好好研究一下,以下是我学习过程中对于sys.argv[ ]的理解。
所以sys.argv[0]
、sys.argv[1]
之类的到底如何理解?首先了解一下不同参数下基本的含义:
① argv[0]
:程序运行的全路径名
② argv[1]
:指向执行程序名后的第一个字符串
③ argv[2]
:指向执行程序名后的第二个字符串
④ argv[n]
:指向执行程序名后的第n个字符串
说这么些其实也不太好理解,先看一看网上举的比较多的例子,我在test.py
中输入了如下代码:
import sys
a = sys.argv[0]
b = sys.argv[1]
c = sys.argv[2]
print(a) # 输出sys.argv[0](程序名)
print(b) # 输出sys.argv[1]
print(c) # 输出sys.argv[2]
第一步:快捷键win+R
并输入cmd
打开命令提示符,进入test.py
所在文件夹路径(比如:我的test.py
位于argv_test
文件夹中,输入D:
回车,再输入cd Pywzy\About Image recognition\argv_test
回车),如下图所示:
第二步:输入python test.py
回车,运行该程序,出现如下报错:
和之前运行别人程序时的报错相同,然后重新输入python test.py
回车,运行结果如下图:
到这里我似乎明白了什么。。。之前的报错是因为没有给程序输入参数,导致除了sys.argv[0]
以外sys.argv[1]
等元素实际上不存在,因此会报错列表索引超出范围。
注:以上是我对Python sys.argv[ ]用法大致的学习过程,接下来我将尝试用该方法读取图片
第一步:我重新建了一个test_argv.py
,并在其中输入如下代码:
import sys
import cv2 as cv2
a = sys.argv[0] # 程序名
print(a)
img = cv2.imread(sys.argv[1]) # 读取图片(sys.argv[1]为所要读取的图片名:img1.jpg)
cv2.imshow("img", img) # 输出并显示图片
cv2.waitKey(0)
第二步(至关重要的一步):将test_argv.py
与要处理的图片放在同一文件夹下,如下图所示:
第三步:在命令提示符中进入该文件夹路径后,输入python test_argv.py img1.jpg
并回车,img1.jpg
为所要处理的图片,结果如下图所示:
终于(菜鸟激动万分)!!!!!! 修改程序再试试读取两张图片:
import sys
import cv2 as cv2
a = sys.argv[0] # 程序名
print(a)
img_1 = cv2.imread(sys.argv[1]) # 读取图片(sys.argv[1]为所要读取的图片名:img1.jpg)
img_2 = cv2.imread(sys.argv[2]) # 读取图片(sys.argv[2]为所要读取的图片名:img2.jpg)
cv2.imshow("img_1", img_1) # 输出并显示第一张图片
cv2.imshow("img_2", img_2) # 输出并显示第二张图片
cv2.waitKey(0)
在命令提示符中输入python test_argv.py img1.jpg img2.jpg
并回车,运行结果如下:
个人理解:在python test_argv.py img1.jpg img2.jpg
这段代码中,python test_argv.py
运行程序,img1.jpg
作为第一个字符串赋给sys.argv[1]
,img2.jpg
作为第二个字符串赋给sys.argv[2]
,因此运行程序后img_1 = cv2.imread(sys.argv[1])
和img_2 = cv2.imread(sys.argv[2])
才能够读取图片。
以上是一位图像处理小白用cv2.imread(sys.argv[1])
读取图片的一些学习心得,第一次写CSDN,还望大佬勿喷,有不对的地方欢迎大家的指点。