float radialImage_distance(DP *a, DP *b) { uint8_t *hashA = (uint8_t*)a->hash; uint8_t *hashB = (uint8_t*)b->hash; double pcc = -1; Digest x = {NULL,hashA, a->hash_length}, y = {NULL, hashB, b->hash_length}; ph_crosscorr(x,y,pcc); return (float)pcc; }
JNIEXPORT jdouble JNICALL Java_org_phash_pHash_imageDistance (JNIEnv *e, jclass cl, jobject hash1, jobject hash2) { if(e->IsInstanceOf(hash1, dctImClass) && e->IsInstanceOf(hash2, dctImClass)) { ulong64 imHash, imHash2; imHash = (ulong64)e->GetLongField(hash1, dctImHash_hash); imHash2 = (ulong64)e->GetLongField(hash2, dctImHash_hash); return ph_hamming_distance(imHash, imHash2); } else if(e->IsInstanceOf(hash1, mhImClass) && e->IsInstanceOf(hash2, mhImClass)) { jbyteArray h = (jbyteArray)e->GetObjectField(hash1, mhImHash_hash); jbyteArray h2 = (jbyteArray)e->GetObjectField(hash2, mhImHash_hash); int N = e->GetArrayLength(h); int N2 = e->GetArrayLength(h2); jbyte *hash = e->GetByteArrayElements(h, NULL); jbyte *hash2 = e->GetByteArrayElements(h2, NULL); double hd = ph_hammingdistance2((uint8_t*)hash, N, (uint8_t*)hash2, N2); e->ReleaseByteArrayElements(h, hash, 0); e->ReleaseByteArrayElements(h2, hash2, 0); return hd; } else if(e->IsInstanceOf(hash1, radialImClass) && e->IsInstanceOf(hash2, radialImClass)) { jbyteArray h = (jbyteArray)e->GetObjectField(hash1, radialImHash_hash); jbyteArray h2 = (jbyteArray)e->GetObjectField(hash2, radialImHash_hash); int N = e->GetArrayLength(h); int N2 = e->GetArrayLength(h2); jbyte *hash = e->GetByteArrayElements(h, NULL); jbyte *hash2 = e->GetByteArrayElements(h2, NULL); Digest x = {NULL,(uint8_t*)hash,N}, y = {NULL,(uint8_t*)hash2,N2}; double pcc = -1; ph_crosscorr(x,y,pcc); e->ReleaseByteArrayElements(h, hash, 0); e->ReleaseByteArrayElements(h2, hash2, 0); return pcc; } return -1; }
int _ph_compare_images(const CImg<uint8_t> &imA,const CImg<uint8_t> &imB,double &pcc, double sigma, double gamma,int N,double threshold){ int result = 0; Digest digestA; if (_ph_image_digest(imA,sigma,gamma,digestA,N) < 0) goto cleanup; Digest digestB; if (_ph_image_digest(imB,sigma,gamma,digestB,N) < 0) goto cleanup; if (ph_crosscorr(digestA,digestB,pcc,threshold) < 0) goto cleanup; if (pcc > threshold) result = 1; cleanup: free(digestA.coeffs); free(digestB.coeffs); return result; }