2015-11-16 34 views
-3

我試圖運行下面的程序,但遇到了這個錯誤。難以運行程序

回溯(最近通話最後一個):

File "C:\Users\danil\Desktop\HK1.py", line 76, in <module> 
img1c = cv2.imread(sys.argv[1]) 

IndexError: list index out of range 

我使用的代碼如下描述:

import cv2 
import sys 
import numpy as np 
def Pixel(img, i, j): 
    i = i if i >= 0 else 0 
    j = j if j >= 0 else 0 
    i = i if i < img.shape[0] else img.shape[0] - 1 
    j = j if j < img.shape[1] else img.shape[1] - 1 
    return img[i, j] 
def xDer(img1, img2): 
    res = np.zeros_like(img1) 
    for i in range(res.shape[0]): 
     for j in range(res.shape[1]): 
      sm = 0 
      sm += Pixel(img1, i, j + 1) - Pixel(img1, i, j) 
      sm += Pixel(img1, i + 1, j + 1) - Pixel(img1, i + 1, j) 
      sm += Pixel(img2, i, j + 1) - Pixel(img2, i, j) 
      sm += Pixel(img2, i + 1, j + 1) - Pixel(img2, i + 1, j) 
      sm /= 4.0 
      res[i, j] = sm 
    return res 
def yDer(img1, img2): 
    res = np.zeros_like(img1) 
    for i in range(res.shape[0]): 
     for j in range(res.shape[1]): 
      sm = 0 
      sm += Pixel(img1, i + 1, j) - Pixel(img1, i, j) 
      sm += Pixel(img1, i + 1, j + 1) - Pixel(img1, i, j + 1) 
      sm += Pixel(img2, i + 1, j) - Pixel(img2, i, j) 
      sm += Pixel(img2, i + 1, j + 1) - Pixel(img2, i, j + 1) 
      sm /= 4.0 
      res[i, j] = sm 
    return res 
def tDer(img, img2): 
    res = np.zeros_like(img) 
    for i in range(res.shape[0]): 
     for j in range(res.shape[1]): 
      sm = 0 
      for ii in range(i, i + 2): 
       for jj in range(j, j + 2): 
        sm += Pixel(img2, ii, jj) - Pixel(img, ii, jj) 
      sm /= 4.0 
      res[i, j] = sm 
    return res 
averageKernel = np.array([[ 0.08333333, 0.16666667, 0.08333333], 
          [ 0.16666667, 0. , 0.16666667], 
          [ 0.08333333, 0.16666667, 0.08333333]],  dtype=np.float32) 
def average(img): 
    return cv2.filter2D(img.astype(np.float32), -1, averageKernel) 
def translateBrute(img, u, v): 
    res = np.zeros_like(img) 
    u = np.round(u).astype(np.int) 
    v = np.round(v).astype(np.int) 
    for i in range(img.shape[0]): 
     for j in range(img.shape[1]): 
      res[i, j] = Pixel(img, i + v[i, j], j + u[i, j]) 
    return res 
def hornShunckFlow(img1, img2, alpha): 
    img1 = img1.astype(np.float32) 
    img2 = img2.astype(np.float32) 
    Idx = xDer(img1, img2) 
    Idy = yDer(img1, img2) 
    Idt = tDer(img1, img2) 
    u = np.zeros_like(img1) 
    v = np.zeros_like(img1) 
#100 iterations enough for small example 
    for iteration in range(100): 
     u0 = np.copy(u) 
     v0 = np.copy(v) 
     uAvg = average(u0) 
     vAvg = average(v0) 
     u = uAvg - 1.0/(alpha**2 + Idx**2 + Idy**2) * Idx * (Idx * uAvg + Idy * vAvg + Idt) 
     v = vAvg - 1.0/(alpha**2 + Idx**2 + Idy**2) * Idy * (Idx * uAvg + Idy * vAvg + Idt) 
    return u, v 
if __name__ == '__main__': 
img1c = cv2.imread(sys.argv[1]) 
img2c = cv2.imread(sys.argv[2]) 
img1g = cv2.cvtColor(img1c, cv2.COLOR_BGR2GRAY) 
img2g = cv2.cvtColor(img2c, cv2.COLOR_BGR2GRAY) 
u, v = hornShunckFlow(img1g, img2g, 0.1) 
imgRes = translateBrute(img2g, u, v) 
cv2.imwrite('Movimento.jpg', imgRes) 
print img1g 
print translateBrute(img2g, u, v) 
+0

你提供了一個參數給你的程序?你如何運行該程序? 'sys.argv [1]'表示它喜歡爭論。 – Evert

+0

'IndexError:list index out of range'告訴你**完全**錯在什麼地方,你有一些你正在提供索引並且它不是一個有效的索引。 –

回答

0
if __name__ == '__main__': 
img1c = cv2.imread(sys.argv[1]) 
img2c = cv2.imread(sys.argv[2]) 

需要被改變成類似

if __name__ == '__main__' 
    if sys.argv[2:]: 
     arg1 = sys.argv[1] 
     arg2 = sys.argv[2] 
    else: 
     print('need at least 2 arguments') 
     sys.exit(2) 
    img1c = cv2.imread(arg1) 
    img2c = cv2.imread(arg2) 
    ... 

然後它需要被稱爲wi第2個文件名(除了腳本.py)。

+0

但我不需要攜帶第一張圖片?然後轉換它的代碼。 –

+0

你的意思是'創建一個圖像'? – hpaulj

+0

是的!我如何上傳圖片這個代碼? –