sys.argv[1].strip()python

sys.argv[1].strip()python,python,python-2.7,opencv,Python,Python 2.7,Opencv,我正在做一个项目,在这个项目中我必须检测树叶上的一些疾病。为此,我必须检测显著特征,即树叶(在我的例子中),并去除图像的背景。我有以下代码 import cv2, sys import numpy as np def backproject(source, target, levels = 2, scale = 1): hsv = cv2.cvtColor(source, cv2.COLOR_BGR2HSV) hsvt

我正在做一个项目,在这个项目中我必须检测树叶上的一些疾病。为此,我必须检测显著特征,即树叶(在我的例子中),并去除图像的背景。我有以下代码

    import cv2, sys
    import numpy as np

    def backproject(source, target, levels = 2, scale = 1):
            hsv = cv2.cvtColor(source,  cv2.COLOR_BGR2HSV)
            hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)
            # calculating object histogram
            roihist = cv2.calcHist([hsv],[0, 1], None, [levels, levels], [0, 180, 0, 256] )

            # normalize histogram and apply backprojection
            cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)
            dst = cv2.calcBackProject([hsvt],[0,1],roihist,[0,180,0,256], scale)
            return dst

    def saliency_by_backprojection(img):
            cv2.pyrMeanShiftFiltering(img, 2, 10, img, 4)

            backproj = np.uint8(backproject(img, img, levels = 2))
            cv2.normalize(backproj,backproj,0,255,cv2.NORM_MINMAX)
            saliencies = [backproj, backproj, backproj]
            saliency = cv2.merge(saliencies)

            cv2.pyrMeanShiftFiltering(saliency, 20, 200, saliency, 2)
            saliency = cv2.cvtColor(saliency, cv2.COLOR_BGR2GRAY)
            cv2.equalizeHist(saliency, saliency)

            return 255-saliency

    def saliency_map(img):
            saliency_hsv = saliency_by_backprojection(img * 1)
            saliency = saliency_hsv
            (T, saliency) = cv2.threshold(saliency, 200, 255, cv2.THRESH_BINARY)
            return saliency

    def largest_contours_rect(saliency):
            contours, hierarchy = cv2.findContours(saliency * 1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
            contours = sorted(contours, key = cv2.contourArea)
            return cv2.boundingRect(contours[-1])

    def refine_saliency_with_grabcut(img, saliency):
            rect = largest_contours_rect(saliency)
            bgdmodel = np.zeros((1, 65),np.float64)
            fgdmodel = np.zeros((1, 65),np.float64)
            saliency[np.where(saliency > 0)] = cv2.GC_FGD
            mask = saliency
            cv2.grabCut(img, mask, rect, bgdmodel, fgdmodel, 1, cv2.GC_INIT_WITH_RECT)
            mask = np.where((mask==2)|(mask==0),0,1).astype('uint8')
            return mask

    def backprojection_saliency(img):
            saliency = saliency_map(img)
            mask = refine_saliency_with_grabcut(img, saliency)
            return mask

    if __name__ == "__main__":
            name = sys.argv[1].strip('k5.jpg')

            img = cv2.imread(sys.argv[1], 1)
            img = cv2.resize(img, (640/2, 480/2))
            mask = backprojection_saliency(img)
            segmentation = img*mask[:,:,np.newaxis]

            cv2.imshow("original", img)
            cv2.imshow("segmentation", segmentation)
            cv2.waitKey(-1)
由于我不熟悉Python和openCV,因此无法解决以下错误

        Traceback (most recent call last):
         File "F:\FYP\Code\saliency-from-backproj-master\saliency.py", line 
      56, in <module>
            name = sys.argv[1].strip('k5.jpg')
           IndexError: list index out of range
回溯(最近一次呼叫最后一次):
文件“F:\FYP\Code\salicency from backproj master\salicency.py”,第行
56,在
name=sys.argv[1].strip('k5.jpg')
索引器:列表索引超出范围

为什么会这样

您没有提供任何命令行参数。
argv变量包含传递到程序中的命令行参数。与执行
python your_script.py verbose print
时一样,
argv
变量包含
['your_script.py','verbose','print']

但是,如果您只提供
python,那么您的_script.py
argv包含
['your_script.py']
(只有一个元素argv[0])。因此,调用
argv[1]
是一个
索引器

关于以下内容的Python文档:

sys.argv
传递给Python脚本的命令行参数列表。argv[0]是脚本名(这取决于操作系统是否为完整路径名)。如果命令是使用解释器的-c命令行选项执行的,则argv[0]被设置为字符串'-c'。如果没有向Python解释器传递脚本名称,则argv[0]是空字符串


看起来您没有向脚本传递所需数量的参数。您正在调用argv[1],因此第二个参数是。由于您可能使用少于2个参数调用脚本,因此您的程序尝试访问不存在的内容。因此出现了“IndexError”。在尝试将核心Python与OpenCV等高级工具结合使用之前,也许您应该花一点时间学习它。这不仅可以消除像这样的大多数问题,还可以使理解
cv2
模块文档变得更容易。这不仅是重复的(而且很容易调试),而且还可以发布一行又一行完全不相关的代码。在发布()之前,请学会将您的代码简化为MCVE。无关:您可能还想阅读
str.strip()
的文档(并在交互式python shell中试用)-这:
sys.argv[1].strip('k5.jpg')
肯定不会达到您的预期效果。