OpenCV Python处理图像数据时迭代速度极慢

5 投票
1 回答
2139 浏览
提问于 2025-04-16 03:09

我最近把一段用OpenCV c++编写的代码,改写成了Python版本,这段代码是用来根据颜色追踪一个物体的。

整体的结果和方法是一样的,当然语法上有区别。但是,当我在视频的每一帧上运行下面的代码时,居然要花2到3秒才能完成,而下面的c++版本几乎是瞬间完成,我可以像按键一样快速地在帧之间切换。

有没有什么想法或者建议呢?

    cv.PyrDown(img, dsimg)
    for i in range( 0, dsimg.height ):
        for j in range( 0, dsimg.width):

            if dsimg[i,j][1] > ( _RED_DIFF + dsimg[i,j][2] ) and dsimg[i,j][1] > ( _BLU_DIFF + dsimg[i,j][0] ):
                res[i,j] = 255
            else:
                res[i,j] = 0

    for( int i =0; i < (height); i++ ) 
    {
        for( int j = 0; j < (width); j++ )
        {
            if( ( (data[i * step + j * channels + 1]) > (RED_DIFF + data[i * step + j * channels + 2]) ) &&
                ( (data[i * step + j * channels + 1]) > (BLU_DIFF + data[i * step + j * channels]) ) )
                data_r[i *step_r + j * channels_r] = 255;
            else
                data_r[i * step_r + j * channels_r] = 0;
        }
    }

谢谢

1 个回答

6

试着用numpy来进行计算,而不是使用嵌套循环。用numpy处理简单的计算时,性能会像C语言那样快。

比如,你的嵌套for循环可以用几个numpy表达式来替代...

我对opencv不是很熟悉,但我觉得现在的python接口已经支持numpy数组,所以你上面的例子应该可以简单写成:

cv.PyrDown(img, dsimg)

data = np.asarray(dsimg)
blue, green, red = data.T

res = (green > (_RED_DIFF + red)) & (green > (_BLU_DIFF + blue))
res = res.astype(np.uint8) * 255

res = cv.fromarray(res)

(当然,这个代码完全没有测试过……)再说一次,我对opencv真的不是很了解,但无论如何,使用嵌套的python for循环来逐个修改图像元素并不是一个好方法。

希望这能帮到你一点!

撰写回答