【问题标题】:OpenCV Python binds incredibly slow iterations through image dataOpenCV Python 通过图像数据绑定非常慢的迭代
【发布时间】:2011-04-02 08:39:05
【问题描述】:

我最近在 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;
        }
    }

谢谢

【问题讨论】:

    标签: c++ python opencv performance


    【解决方案1】:

    尝试使用 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 循环不是修改图像元素的方法,无论如何...

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

    【讨论】:

    • 这确实加快了速度,但我似乎无法弄清楚为什么结果与我的图像阈值更密切相关,并且它没有找到图像上看起来应该的绿色区域?
    • 我可能误解了图像的红色、绿色和蓝色通道的顺序...(从您上面的代码来看,蓝色似乎是第一个通道,红色是最后一个通道。 ..) 也许尝试将“数据”数组解压缩为red, green, blue = data.T?只是一个疯狂的猜测......我可能完全错了......
    • 是的,这是我最初的想法,但更改顺序并不会产生不同的结果。 _RED_DIFF 和 _BLU 是高值,155,所以图像内部不应该有很多白色像素,但还是有;当我将 _DIFF 设置为 255 时,它几乎全是白色的?我似乎无法理解 res = (green > (_RED_DIFF + red)) & (green > (_BLU_DIFF + blue)) 的结果。
    • 嗯...这可能是一个溢出问题...在 numpy 中,如果您正在处理 uint8,它们会像在 C 中一样溢出。如果您将 155 添加到 uint8 ,很有可能很多值溢出到较低的值。也许尝试将事物转换为 uint16 开始? data = np.asarray(dsimg, dtype=np.uint16)?
    • 我必须说非常聪明。那成功了。感谢您的所有帮助,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2018-11-26
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多