版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
两张军装图 0.393316
吴京截取图 0.956293
两张敬礼图 0.519365
军装和夜景 0.627251
#include "StdAfx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
using namespace cv;
void getRGBvector(const Mat&src, vector<unsigned int>& count)//得到64维向量
{
int nRows = src.rows,nCols = src.cols * src.channels();
const uchar* p;
for (int i = 0; i < nRows; ++i)
{
p = src.ptr<uchar>(i);
for (int j = 0; j < nCols; j += 3)
{
int r = int(p[j])/64;
int g = int(p[j + 1])/64;
int b = int(p[j + 2])/64;
count[r * 16 + g * 4 + b]++;
}
}
}
double getVectorLength(vector<unsigned int> &vec)
{
long float res = 0;
for (int i = 0; i < vec.size(); i++)
res += vec[i] * vec[i];
return sqrt(res);
}
double getcos(vector<unsigned int> &count1, vector<unsigned int> &count2)
{
double len1 = getVectorLength(count1);
double len2 = getVectorLength(count2);
assert(len1 != 0 && len2 != 0);
long long sum = 0;
for (int i = 0; i < count1.size(); i++)
sum += count1[i] * count2[i];
return (double)sum / len1 / len2 >0 ? (double)sum / len1 / len2:0;
}
double getsimilarity(const Mat&src1, const Mat&src2)
{
vector<unsigned int> count1(64), count2(64);
getRGBvector(src1, count1);
getRGBvector(src2, count2);
double res = getcos(count1, count2);
return res;
}
int main()
{
Mat src1 = imread("F://army//person.jpg",1),src2 = imread("F://army//person4.jpg", 1);
imshow("src1", src1),imshow("src2", src2);
double res = getsimilarity(src1,src2);
cout << res << endl;
waitKey(0);
}
//以下是尝试的一段运行不了的代码,但也有借鉴意义
/*
ahash,全称叫做average hash,应该是phash(perceptual hash, 感知哈希)算法的一种。
主要用于由图像的缩略图搜原图,对于图像的旋转、平移、对比度和微变形等都无能为力,所以很局限。
*/
#include<opencv2/opencv.hpp>
#include<bitset>
using namespace std;
using namespace cv;
#define hashlength 64
const int size = 8;
void alike(Mat_<uchar> img, bitset<hashlength> &vec){
float temp = 0;
for (int i = 0; i < size; i++){
for (int j = 0; j < size; j++){
temp += img(i, j);
}
}
float average = temp / hashlength;
cout << average << endl;
for (int i = 0; i < size; i++){
int pos = i * size;
for (int j = 0; j < size; j++){
vec[pos + j] = img(i, j) >= average ? 1 : 0;
}
}
}
int main(){
Mat img = imread("F://army//person.jpg");
Mat img1 = imread("F://army//person4.jpg");
resize(img, img, Size(size, size));
cvtColor(img, img, CV_BGR2GRAY);
resize(img1, img1, Size(size, size));
cvtColor(img1, img1, CV_BGR2GRAY);
bitset<hashlength> hash_vec;
bitset<hashlength> hash_vec_;
alike(img,hash_vec);
alike(img1,hash_vec_);
int num = 0;
for (int i = 0; i < hashlength; i++){
cout << hash_vec.at(i);
}
cout << endl;
for (int i = 0; i < hashlength; i++){
cout << hash_vec_.at(i);
num += hash_vec[i] == hash_vec_[i] ? 0 : 1;
}
cout << endl;
cout << num << endl;
cout << "相似性:"<< (float)(hashlength-num )/ hashlength;
cin.get();
return 0;
}
}