怎么说呢,最近在搞这个图像匹配,就试了一下这个功能
原算法
Mat ori1 = imread("D:/trying/newImg/1.jpg");
Mat ori2 = imread("D:/trying/newImg/1.jpg");
Mat src1, src2;
Mat dst1, dst2;
double t = (double)getTickCount();
int sizeNum = 64;
int pSN = sizeNum*sizeNum;
resize(ori1, src1, Size(sizeNum, sizeNum), 0, 0, INTER_NEAREST);
resize(ori2, src2, Size(sizeNum, sizeNum), 0, 0, INTER_NEAREST);
cvtColor(src1, dst1, CV_BGR2GRAY);
cvtColor(src2, dst2, CV_BGR2GRAY);
int arr1[4096];
int arr2[4096];
int aveg1 = 0, aveg2 = 0;
int temp = 0;
uchar *data1;
uchar *data2;
for (int i = 0; i < sizeNum; i++)
{
data1 = src1.ptr(i);
data2 = src2.ptr(i);
for (int j = 0; j < sizeNum; j++)
{
temp = i * sizeNum + j;
arr1[temp] = data1[j] / 4 * 4;
arr2[temp] = data2[j] / 4 * 4;
aveg1 += arr1[temp];
aveg2 += arr2[temp];
}
}
aveg1 /= pSN;
aveg2 /= pSN;
for (int i = 0; i < pSN; i++)
{
arr1[i] = arr1[i] >= aveg1 ? 1 : 0;
arr2[i] = arr2[i] >= aveg2 ? 1 : 0;
}
int difNum = 0;
for (int i = 0; i < pSN; i++)
{
if (arr1[i] != arr2[i])
{
difNum++;
}
}
cout << "不匹配的点数量:" << difNum << endl;
if (difNum <= 5)
cout << "非常相似!" << endl;
else if (difNum <= 10)
cout << "比较相似!" << endl;
else
cout << "根本不像!" << endl;
t = ((double)getTickCount() - t) / getTickFrequency();
cout << "经过的时间: " << t << endl;
cvWaitKey();
自己尝试稍微变了一下,其实差不多
void PHA0(Mat ori1,Mat ori2,int sizeNum)
{
Mat src1, src2;
Mat dst1, dst2;
int pSN = sizeNum*sizeNum;
resize(ori1, src1, Size(sizeNum, sizeNum), 0, 0, INTER_NEAREST);
resize(ori2, src2, Size(sizeNum, sizeNum), 0, 0, INTER_NEAREST);
cvtColor(src1, dst1, CV_BGR2GRAY);
cvtColor(src2, dst2, CV_BGR2GRAY);
int *arr1 = new int[pSN];
int *arr2 = new int[pSN];
int temp = 0;
for (int i = 0; i < sizeNum; i++)
{
uchar *data1 = src1.ptr(i);
uchar *data2 = src2.ptr(i);
for (int j = 0; j < sizeNum; j++)
{
temp = i * sizeNum + j;
arr1[temp] = data1[j] / 4 * 4;
//cout << "data1, arr1: " << int(data1[j]) << "_" << arr1[temp] << endl;
arr2[temp] = data2[j] / 4 * 4;
}
}
for (int i = 0; i < pSN; i++)
{
arr1[i] = arr1[i] / 10.0;
arr2[i] = arr2[i] / 10.0;
}
int difNum = 0;
for (int i = 0; i < pSN; i++)
{
if (arr1[i] != arr2[i])
{
difNum++;
}
}
cout << "不匹配的点数量:" << difNum << endl;
if (difNum <= 5)
cout << "神似!" << endl;
else if (difNum <= 10)
cout << "貌似!" << endl;
else
cout << "异类!" << endl;
cvWaitKey();
}
试了一下效果基本上差不多,哈哈,嗯,挺有意思的 运行效果: