2013-10-15 3 views
0

Я пытаюсь выполнить перенос поверх приведенной ниже функции PHP на Python. Однако я получаю следующее сообщение об ошибке: линиях 189, в detectOnSubImage Прямоугольник = прямоугольники [i_rect] IndexError: список индексов вне диапазонаПреобразование PHP-функции в Python

прямоугольникам получают список, расположенный в current_node [1]

rects = current_node[1]

И цикл, пока не будет выходить из диапазона мимо длина списка прямоугольников

while i_rect < len(rects):  
     i_rect = i_rect+1  
     rect = rects[i_rect] 

что я пропустил при переносе через эту PHP функции Python и что будет правильный код Python эквивалентом?

PHP код: (ниже)

protected function detectOnSubImage($x, $y, $scale, $ii, $ii2, $w, $iiw, $inv_area) 
{ 
    $inv_area"; 
    $mean = ($ii[($y+$w)*$iiw + $x + $w] + $ii[$y*$iiw+$x] - $ii[($y+$w)*$iiw+$x] - $ii[$y*$iiw+$x+$w])*$inv_area; 
    $vnorm = ($ii2[($y+$w)*$iiw + $x + $w] 
       + $ii2[$y*$iiw+$x] 
       - $ii2[($y+$w)*$iiw+$x] 
       - $ii2[$y*$iiw+$x+$w])*$inv_area - ($mean*$mean); 
    $vnorm = $vnorm > 1 ? sqrt($vnorm) : 1; 
    $passed = true; 
    for ($i_stage = 0; $i_stage < count($this->detection_data); $i_stage++) { 
     $stage = $this->detection_data[$i_stage]; 
     $trees = $stage[0]; 

     $stage_thresh = $stage[1]; 
     $stage_sum = 0; 

     for ($i_tree = 0; $i_tree < count($trees); $i_tree++) { 
      $tree = $trees[$i_tree]; 
      $current_node = $tree[0]; 
      $tree_sum = 0; 
      while ($current_node != null) { 
       $vals = $current_node[0]; 
       $node_thresh = $vals[0]; 
       $leftval = $vals[1]; 
       $rightval = $vals[2]; 
       $leftidx = $vals[3]; 
       $rightidx = $vals[4]; 
       $rects = $current_node[1]; 

       $rect_sum = 0; 
       for ($i_rect = 0; $i_rect < count($rects); $i_rect++) { 
        $s = $scale; 
        $rect = $rects[$i_rect]; 
        $rx = ($rect[0]*$s+$x)>>0; 
        $ry = ($rect[1]*$s+$y)>>0; 
        $rw = ($rect[2]*$s)>>0; 
        $rh = ($rect[3]*$s)>>0; 
        $wt = $rect[4]; 
        $r_sum = ($ii[($ry+$rh)*$iiw + $rx + $rw] 
           + $ii[$ry*$iiw+$rx] 
           - $ii[($ry+$rh)*$iiw+$rx] 
           - $ii[$ry*$iiw+$rx+$rw])*$wt; 
        $rect_sum += $r_sum; 
       } 
       $rect_sum *= $inv_area; 
       $current_node = null; 
       if ($rect_sum >= $node_thresh*$vnorm) { 
        if ($rightidx == -1) { 
         $tree_sum = $rightval; 
        } else { 
         $current_node = $tree[$rightidx]; 
        } 
       } else { 
        if ($leftidx == -1) { 
         $tree_sum = $leftval; 
        } else { 
         $current_node = $tree[$leftidx]; 
        } 
       } 
      } 
      $stage_sum += $tree_sum; 
     } 
     if ($stage_sum < $stage_thresh) { 
      return false; 
     } 
    } 
    return true; 
} 
} 

код Python: (ниже)

def detectOnSubImage(self, x, y, scale, ii, ii2, w, iiw, inv_area): 
    mean = (ii[(y+w)*iiw + x + w] + ii[y*iiw+x] - ii[(y+w)*iiw+x] - ii[y*iiw+x+w])*inv_area 
    vnorm = (ii2[(y+w)*iiw + x + w] + ii2[y*iiw+x] - ii2[(y+w)*iiw+x] - ii2[y*iiw+x+w])*inv_area - (mean*mean) 
    vnorm = sqrt(vnorm) if vnorm > 1 else 1 
    #var foo = (test) ? "True" : "False"; 
    #foo = "True" if test else "False" 
    passed = True 
    #for i_stage in xrange(0, i_stage < (len(self.detection_data)), i_stage= i_stage+1): 
    i_stage=0 
    while i_stage < len(self.detection_data): 
     i_stage= i_stage+1 
     stage = self.detection_data[i_stage] 
     trees = stage[0] 
     stage_thresh = stage[1] 
     stage_sum = 0 

     #for i_tree in xrange(0, i_tree < len(trees), i_tree= i_tree+1): 
     i_tree=0 
     while i_tree < len(trees): 
      i_tree= i_tree+1 
      tree = trees[i_tree] 
      current_node = tree[0] 
      tree_sum = 0 
      while (current_node != None): 
       vals = current_node[0] 
       node_thresh = vals[0] 
       leftval = vals[1] 
       rightval = vals[2] 
       leftidx = vals[3] 
       rightidx = vals[4] 
       rects = current_node[1] 
       rect_sum = 0 
       #for i_rect in xrange(0, i_rect < len(rects), i_rect = i_rec+1): 
       i_rect = 0 
       while i_rect < len(rects): 
        i_rect = i_rect+1 
        s = scale 
        rect = rects[i_rect] 
        rx = (rect[0]*s+x)>>0 
        ry = (rect[1]*s+y)>>0 
        rw = (rect[2]*s)>>0 
        rh = (rect[3]*s)>>0 
        wt = rect[4] 

        r_sum = (ii[(ry+rh)*iiw + rx + rw] + ii[ry*iiw+rx] - ii[(ry+rh)*iiw+rx] - ii[ry*iiw+rx+rw])*wt 
        rect_sum = rect_sum + r_sum 
       rect_sum = rect_sum * inv_area 
       current_node = None 
       if (rect_sum >= node_thresh*vnorm): 
        if (rightidx == -1): 
         tree_sum = rightval 
        else: 
         current_node = tree[rightidx] 
       else: 
        if (leftidx == -1): 
         tree_sum = leftval 
        else: 
         current_node = tree[leftidx] 
      stage_sum = stage_sum + tree_sum 
     if (stage_sum < stage_thresh): 
      return false 
    return True 

Вот структура дерева и другие var_dumps внутри PHP кода, который показывает многомерный массив

$ дерево = $ деревья [0]
массива (2) {[0] => массив (2) {[0] => Array (5) {[0] => поплавок (0,00432723) [1 ] => float (0.0383819) [2] => f (1) [1] => массив (2) {[0] => массив (5) {[0] => int (2) [1] => int (7) [2] => int (16) [3] => int (4) [4] => int (-1)} [1] => array (5) {[0] => int (2) [1] => int (9) [2] => int (16) [3] => int (2) [4] => int (2)}}} [1] => array (2) {[0] => array (5) {[0] => float (0.0130762) [1] => float (0.896526) [2] => float (0.262931) [3] => int (-1) [4] => int (-1)} [1] => array (2) {[0] => array (5) {[0] => int (8) [1] => int (4) [2] => int (3) [3] => int (14) [4] => int (-1)} [1] => array (5) {[0] => int (8) [1] => int (11) [2] => int (3) [3] => int (7) [4] => int (2)}}}}

$ current_node = $ tree [0]
массив (2) {[0] => массив (5) {[0] => float (0.00432723) [1] => float (0.0383819) [2] => float (-1) [3] => int (-1) [4] => int (1)} [1] => array (2) {[0] => array (5) {[0] => int (2) [1] => int (7) [2] => int (16) [3] => int (4) [4] => int (-1)} [1] => array (5) {[0] => int (2) [1] => int (9) [2] => int (16) [3] => int (2) [4] => int (2)}}}

$ vals = $ current_node [0]
массив (5) {[0] => float (0.00432723) [1] => float (0.0383819) [2] => float (-1) [3] = > Int (-1) [4] => Int (1)}

$ прямоугольники = $ current_node [1]
массива (2) {[0] => Array (5) {[0] => int (2) [1] => int (7) [2] => int (16) [3] => int (4) [4] => int (-1)} [1] => array (5) {[0] => int (2) [1] => int (9) [2] => int (16) [3] => int (2) [4] => int (2)}}

$ rect = $ rects [0]
массив (5) {[0] => int (2) [1] => int (7) [2] => int (16) [3] => int (4) [4] => int (-1)}

+0

Вы устанавливаете 'current_node', чтобы содержать значение' tree [0] ', поэтому оно имеет длину 1 (в нем существует только нулевой элемент). Какова структура 'tree' в php и что это такое в python? ('print tree' перед назначением' current_node'). Если это специальный объект, он может быть «упакован» по-разному. (Например, '[[1,2,3]]' не будет иметь элемент 1.) – beroe

+0

В PHP $ tree отображается как массив с длиной 2 $ tree = $ trees [$ i_tree]; \t \t \t \t print "Дерево: $ tree"; \t \t \t \t $ length = count ($ tree); \t \t \t \t print "Длина массива деревьев: длина $; – bfalz

+0

И эта структура выживает в питоне? Python не очень хорош в списках как суррогат для многомерных массивов. Я думаю, нам нужно увидеть часть, где 'trees' определяется или импортируется в Python. – beroe

ответ

0

Чтобы отладить это, я рекомендуется распечатать всю структуру переменных tree и trees (и других) в Python и в PHP-коде. Это позволит вам сравнить, какие назначения и индексирование вам нужно сделать, чтобы сделать код совместимым. У меня были проблемы в прошлом, когда речь шла только о добавлении еще одного [0] к концу назначения массива, потому что он был вложен на один уровень глубже в PHP или JSON или что бы я ни ожидал.

Удачи вам!

Смежные вопросы