, 여기에 내가 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로 변환하고 치수를보고 각 픽셀에 대해 아주 간단한 한 번에 해시를 수행하고 최종 결과를 반환하기 만하면됩니다. 이 구현을 개선하는 방법은 여러 가지가 있지만 (이 질문에 대한 다른 답변 참조), 이것이 수행되어야 할 사항의 기본 요지입니다.
OP는 나중에이 이미지를 비교하기 위해 조회 테이블을 만드는 데이 해싱 함수를 어떻게 사용할 것인지 언급했습니다. 이것은 매우 간단한 조회 초기화 기능을 필요 -이 같은 :
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...
}
내가 같은 클래스에서 선언 될 필요가 imageTable라고 여기 QMap 사용하고 있습니다
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.
}
그게 전부입니다. 나는 이것이 누군가를 돕기를 바란다 - 나는 그것을 알아낼 수있는 경험을 갖게되어 기뻤지 만, 그것은 나에게 시간을 절약 해 주었을 것이다.
제목의 오타 (어떻게 될 수 있습니다 ...) :) – claf