OpenCV Python связывает невероятно медленные итерации с данными изображения - PullRequest
5 голосов
/ 22 августа 2010

Недавно я взял некоторый код, который отслеживает объект на основе цвета в 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 голосов
/ 23 августа 2010

Попробуйте использовать numpy для расчета, а не вложенные циклы. Вы должны получить C-подобную производительность для простых вычислений, подобных этой, от numpy.

Например, ваши вложенные циклы for можно заменить парой пустых выражений ...

Я не очень хорошо знаком с opencv, но я думаю, что привязки python теперь имеют простой интерфейс массива, так что ваш пример выше должен быть таким простым:

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 для циклов - это не способ изменить изображение поэлементно, несмотря на ... *

Надеюсь, это хоть немного поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...