5 votes

OpenCV Python lie des itérations incroyablement lentes à travers des données d'image

J'ai récemment pris du code qui suivait un objet en fonction de sa couleur en OpenCV c++ et l'a réécrit dans les liens python.

Les résultats globaux et la méthode étaient les mêmes, la syntaxe en moins évidemment. Mais lorsque j'exécute le code ci-dessous sur chaque image d'une vidéo, cela prend presque 2 à 3 secondes, alors que la variante c++, également ci-dessous, est instantanée en comparaison et je peux itérer entre les images aussi vite que mon doigt peut appuyer sur une touche.

Des idées ou des commentaires ?

    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;
        }
    }

Remerciements

6voto

Joe Kington Points 68089

Essayez d'utiliser numpy pour effectuer vos calculs, plutôt que des boucles imbriquées. Vous devriez obtenir des performances comparables à celles du langage C pour des calculs simples comme celui-ci avec numpy.

Par exemple, vos boucles for imbriquées peuvent être remplacées par quelques expressions numpy...

Je ne suis pas très familier avec opencv, mais je pense que les liaisons python ont maintenant une interface numpy array, donc votre exemple ci-dessus devrait être aussi simple que :

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)

(Complètement non testé, bien sûr...) Encore une fois, je ne suis pas vraiment familier avec opencv, mais les boucles for imbriquées de python ne sont pas la façon de procéder pour modifier une image par éléments, quoi qu'il en soit...

J'espère que cela vous aidera un peu !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X