OpenCV Python通过图像数据绑定极其缓慢的迭代

blu*_*uth 5 c++ python performance opencv

我最近在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
Run Code Online (Sandbox Code Playgroud)
    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

谢谢

Joe*_*ton 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)
Run Code Online (Sandbox Code Playgroud)

(完全没有经过测试,当然......)同样,我真的不是非常熟悉opencv,但嵌套的python for循环不是修改图像元素的方法,不管......

无论如何,希望有所帮助!