我正在尝试将以下PHP函数移植到Python。但是我收到以下错误:第189行,在detectOnSubImage中 rect = rects [i_rect] IndexError:列表索引超出范围
Rects接收位于current_node [1]
的列表rects = current_node [1]
while循环不会超出列表长度的范围
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
这是PHP代码中的树结构和其他var_dumps,它显示了一个多维数组
$ tree = $ trees [0]
array(2){[0] =&gt; array(2){[0] =&gt; array(5){[0] =&gt; float(0.00432723)[1] =&gt; float(0.0383819)[2] =&gt; float(-1)[3] =&gt; int(-1)[4] =&gt; int(1)} [1] =&gt; array(2){[0] =&gt; array(5){[0] =&gt; int(2)[1] =&gt; int(7)[2] =&gt; int(16)[3] =&gt; int(4)[4] =&gt; int(-1)} [1] =&gt; array(5){[0] =&gt; int(2)[1] =&gt; int(9)[2] =&gt; int(16)[3] =&gt; int(2)[4] =&gt; int(2)}}} [1] =&gt; array(2){[0] =&gt; array(5){[0] =&gt; float(0.0130762)[1] =&gt; float(0.896526)[2] =&gt; float(0.262931)[3] =&gt; int(-1)[4] =&gt; int(-1)} [1] =&gt; array(2){[0] =&gt; array(5){[0] =&gt; int(8)[1] =&gt; int(4)[2] =&gt; int(3)[3] =&gt; int(14)[4] =&gt; int(-1)} [1] =&gt; array(5){[0] =&gt; int(8)[1] =&gt; int(11)[2] =&gt; int(3)[3] =&gt; int(7)[4] =&gt; int(2)}}}}
$ current_node = $ tree [0]
array(2){[0] =&gt; array(5){[0] =&gt; float(0.00432723)[1] =&gt; float(0.0383819)[2] =&gt; float(-1)[3] =&gt; int(-1)[4] =&gt; int(1)} [1] =&gt; array(2){[0] =&gt; array(5){[0] =&gt; int(2)[1] =&gt; int(7)[2] =&gt; int(16)[3] =&gt; int(4)[4] =&gt; int(-1)} [1] =&gt; array(5){[0] =&gt; int(2)[1] =&gt; int(9)[2] =&gt; int(16)[3] =&gt; int(2)[4] =&gt; int(2)}}}
$ vals = $ current_node [0]
array(5){[0] =&gt; float(0.00432723)[1] =&gt; float(0.0383819)[2] =&gt; float(-1)[3] =&gt; int(-1)[4] =&gt; int(1)}
$ rects = $ current_node [1]
array(2){[0] =&gt; array(5){[0] =&gt; int(2)[1] =&gt; int(7)[2] =&gt; int(16)[3] =&gt; int(4)[4] =&gt; int(-1)} [1] =&gt; array(5){[0] =&gt; int(2)[1] =&gt; int(9)[2] =&gt; int(16)[3] =&gt; int(2)[4] =&gt; int(2)}}
$ rect = $ rects [0]
array(5){[0] =&gt; int(2)[1] =&gt; int(7)[2] =&gt; int(16)[3] =&gt; int(4)[4] =&gt; int(-1)}
答案 0 :(得分:0)
为了调试这个,我建议在Python和PHP代码中打印出tree
和trees
变量(以及其他变量)的整个结构。这将使您可以比较为使代码兼容所需的分配和索引。我在过去遇到过一个问题,那就是在数组赋值的末尾添加一个[0]
,因为它在PHP或JSON中嵌套了一层,或者比我预期的更深。