Juste au cas où quelqu'un vient à travers ce problème (et pas trop terriblement expérimenté avec des choses de hachage, en particulier quelque chose comme une image), voici une solution très simple j'ai utilisé pour le hachage QPixmaps et les entrer dans une recherche table pour une comparaison ultérieure:
qint32 HashClass::hashPixmap(QPixmap pix)
{
QImage image = pix.toImage();
qint32 hash = 0;
for(int y = 0; y < image.height(); y++)
{
for(int x = 0; x < image.width(); x++)
{
QRgb pixel = image.pixel(x,y);
hash += pixel;
hash += (hash << 10);
hash ^= (hash >> 6);
}
}
return hash;
}
est la fonction de hachage lui-même ici (vous pouvez l'avoir hachage dans un qint64 si vous désirez moins de collisions). Comme vous pouvez le voir, je convertis le pixmap en QImage, et je passe simplement à travers ses dimensions et j'effectue un hachage un-à-un très simple sur chaque pixel et renvoie le résultat final. Il y a plusieurs façons d'améliorer cette implémentation (voir les autres réponses à cette question), mais c'est l'essentiel de ce qui doit être fait.
L'OP a mentionné comment il utiliserait cette fonction de hachage pour ensuite construire une table de correspondance pour comparer plus tard des images. Cela nécessiterait une fonction d'initialisation de recherche très simple - quelque chose comme ceci:
void HashClass::initializeImageLookupTable()
{
imageTable.insert(hashPixmap(QPixmap(":/Image_Path1.png")), "ImageKey1");
imageTable.insert(hashPixmap(QPixmap(":/Image_Path2.png")), "ImageKey2");
imageTable.insert(hashPixmap(QPixmap(":/Image_Path3.png")), "ImageKey2");
// Etc...
}
J'utilise un QMap appelé ici ImageTable qui doivent être déclarées dans la classe en tant que tel:
QMap<qint32, QString> imageTable;
Puis, enfin, quand vous voulez comparer une image aux images de votre table de recherche (par exemple: "quelle image, parmi les images que je connais, est-ce que cette image particulière?"), Vous appelez la fonction de hachage l'image (que je suppose être aussi un QPixmap) et la valeur de retour QString vous permettront de comprendre cela. Quelque chose comme ça fonctionnerait:
void HashClass::compareImage(const QPixmap& pixmap)
{
QString value = imageTable[hashPixmap(pixmap)];
// Do whatever needs to be done with the QString value and pixmap after this point.
}
C'est tout. J'espère que cela aidera quelqu'un - cela m'aurait permis de gagner du temps, même si j'étais heureux d'avoir l'expérience de le découvrir.
typo dans le titre (comment peut ce qui est ...) :) – claf