На всякий случай, если кто-то столкнется с этой проблемой (и не слишком сильно разбирается в хэшировании, особенно что-то вроде изображения), вот ОЧЕНЬ простое решение, которое я использовал для хеширования QPixmaps и ввода их в таблицу поиска для последующего сравнения:
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;
}
Вот сама хеш-функция (вы можете хэшировать ее в qint64, если хотите меньше коллизий). Как видите, я конвертирую растровое изображение в QImage, просто просматриваю его размеры и выполняю очень простое хеширование по одному для каждого пикселя и возвращаю окончательный результат. Есть много способов улучшить эту реализацию (см. другие ответы на этот вопрос), но это основная суть того, что нужно сделать.
ОП упомянул, как он будет использовать эту функцию хеширования, чтобы затем построить таблицу поиска для последующего сравнения изображений. Для этого потребуется очень простая функция инициализации поиска — что-то вроде этого:
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...
}
Я использую здесь QMap с именем imageTable, который необходимо объявить в классе как таковой:
QMap<qint32, QString> imageTable;
Затем, наконец, когда вы хотите сравнить изображение с изображениями в вашей таблице поиска (то есть: «каким изображением из известных мне изображений может быть это конкретное изображение?»), вы просто вызываете функцию хеширования на изображение (которое, как я предполагаю, также будет QPixmap), и возвращаемое значение QString позволит вам понять это. Что-то вроде этого будет работать:
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.
}
Вот и все. Я надеюсь, что это поможет кому-то - это сэкономило бы мне время, хотя я был счастлив, что разобрался с этим.
person
Community
schedule
22.08.2012