import imgcompare
...

for filename in os.listdir(myPath):
     if filename.endswith(".png"):
         listIm1.append(filename)

for filename2 in os.listdir(myPath2):
     if filename2.endswith(".png"):
         listIm2.append(filename2)

Donc je remplis mes deux listes d'images, maintenant je voudrais comparer les images des deux listes une par une en suivant le même index, par exemple:
listIm1 [0] avec listImg2 [0]
listIm1 [1] avec listImg2 [1]
et ainsi de suite ... et c'est le code:

for item in listIm1:
        ifSame = imgcompare.is_equal(listIm1[item],listIm2[item],tolerance=2)
        print ifSame

Mais obtenez l'erreur:

same = imgcompare.is_equal(listIm1[item], listIm2[item], tolerance=2)
TypeError: list indices must be integers, not str

il semble que imgcompare.is_equal () ne fonctionne pas avec les listes, existe-t-il un moyen pythonique pour le faire fonctionner?

0
mario Letterman 18 avril 2018 à 00:10

3 réponses

Meilleure réponse

Puisque

 if filename2.endswith(".png"):
         listIm2.append(filename2)

for item in listIm1:
        # item = "someimagine.png"
 ifSame = imgcompare.is_equal(listIm1[item],listIm2[item],tolerance=2)
        #listIm1[someimagine.png] is what you are asking => retrun Type Error

Je suppose que vous cherchez quelque chose comme ça:

modifier:

import os

for filename in os.listdir(myPath):
    if filename2.endswith(".png"):
       img_path = os.path.join(myPath,filename2)  
       listIm2.append(img_path)

listIm1 = [] 
listIm2 = []
for i in range(len(listIm1)):

     ifSame = imgcompare.is_equal(listIm1[i],listIm2[i],tolerance=2)
     print ifSame

Et c'est mieux si len (listIm1) == len (listIm2)

1
Peko Chan 18 avril 2018 à 07:58

Le problème ici est que vous essayez d'obtenir l'index de listIm1 en utilisant item. Ce que vous voulez faire, c'est utiliser un range(), comme:

for i in range(len(listIm1)):
            ifSame = imgcompare.is_equal(listIm1[i],listIm2[i],tolerance=2)

Comme l'a souligné @Matt, cela ne fonctionnera que si vous savez que les listes sont de la même longueur au préalable, sinon cela générera une erreur d'index.

1
Colin Ricardo 17 avril 2018 à 21:30

Vous utilisez un pour chaque boucle, qui saisit chaque élément de votre liste fournie listIm1 et le stocke dans une variable temporaire item, vous passez ensuite item (qui est une chaîne) en tant que indexez vos deux listes. Les indices d'une liste doivent être un entier, et c'est l'erreur que vous obtenez.

for dir1_file in listIm1:
    for dir2_file in listIm2:
        ifSame = imgcompare.is_equal(dir1_file,dir2_file,tolerance=2)
        print ifSame

Ce code utilise deux pour chaque boucle, il examine chaque élément dans les deux listes et les utilise comme arguments pour votre méthode.

0
Matt 17 avril 2018 à 21:24