资源简介

用matlab实现了基于乘积量化的快速sift特征匹配,相比于传统的特征比配方法,提高了匹配的速度。

资源截图

代码片段和文件信息

clear; 
close all;
clc;
% 加载用于训练的sift描述子向量
load siftTrain.mat;

% 将用于训练的sift描述子向量均分为16段,每段8维
sub_vector = cell(161);
for i = 1 : 16
    sub_vector{i} = siftDescriptorTrain((i-1)*8+1:8*i:);
end

C = cell(161);
Idx = cell(161);
opts = statset(‘MaxIter‘300);
% 对每一段进行k-means聚类,k=64
for i = 1 : 16
    [Idx{i}  C{i}] = kmeans(sub_vector{i}‘64‘Options‘opts);
end

dist = cell(161);
for i = 1 : 16
    dist{i} = zeros(6464);
end

% 生成16个distance matrix
for i = 1 : 16
    for j = 1 : 64
        tmpFeat = repmat(C{i}(j:) 64 1);
        dist{i}(j:) = (sum((tmpFeat - C{i}).^22))‘;
    end
end

%tic

%% Load two images and their SIFT features
src_1 = ‘./test images/ukbench00000.jpg‘;
src_2 = ‘./test images/ukbench00003.jpg‘;
ext1 = ‘.dsift‘; %‘.vsift_640‘; % extension name of SIFT file
ext2 = ‘.dsift‘; %‘.vsift_640‘; % extension name of SIFT file
siftDim = 128;

%% load image 
im_1 = imread(src_1);
im_2 = imread(src_2);

%% 读取sift特征
featPath_1 = [src_1 ext1];
featPath_2 = [src_2 ext2];

fid_1 = fopen(featPath_1 ‘rb‘);
featNum_1 = fread(fid_1 1 ‘int32‘); % �ļ���SIFT��������Ŀ
SiftFeat_1 = zeros(siftDim featNum_1); 
paraFeat_1 = zeros(4 featNum_1);
for i = 1 : featNum_1 % �����ȡSIFT����
    SiftFeat_1(: i) = fread(fid_1 siftDim ‘uchar‘); %�ȶ���128ά������
    paraFeat_1(: i) = fread(fid_1 4 ‘float32‘);     %�ٶ���[x y scale orientation]��Ϣ
end
fclose(fid_1);

fid_2 = fopen(featPath_2 ‘rb‘);
featNum_2 = fread(fid_2 1 ‘int32‘); % �ļ���SIFT��������Ŀ
SiftFeat_2 = zeros(siftDim featNum_2);
paraFeat_2 = zeros(4 featNum_2);
for i = 1 : featNum_2 % �����ȡSIFT����
    SiftFeat_2(: i) = fread(fid_2 siftDim ‘uchar‘); %�ȶ���128ά������
    paraFeat_2(: i) = fread(fid_2 4 ‘float32‘);     %�ٶ���[x y scale orientation]��Ϣ
end
fclose(fid_2);

%% 将第一张待匹配图像的sift特征向量分为16段
feat1_vector = cell(161);
for i = 1 : 16
    feat1_vector{i} = SiftFeat_1((i-1)*8+1:8*i:);
end

%% 判断待匹配图像的每个特征向量的每一段各属于哪一类
minposition = zeros(16 featNum_1); 
for i = 1 : 16
    for j =1 : featNum_1
        tmpFeat = repmat(feat1_vector{i}(:j)164);
        d1 = sum((tmpFeat - C{i}‘).^2); % distance
        minposition(ij) = find(d1==min(d1));
    end
end

%% 将第二张待匹配图像的sift特征向量分为16段
feat2_vector = cell(161);
for i = 1 : 16
    feat2_vector{i} = SiftFeat_2((i-1)*8+1:8*i:);
end

%% 判断待匹配图像的每个特征向量的每一段各属于哪一类
minposition2 = zeros(16 featNum_2); 
for i = 1 : 16
    for j =1 : featNum_2
        tmpFeat = repmat(feat2_vector{i}(:j)164);
        d1 = sum((tmpFeat - C{i}‘).^2); % distance
        minposition2(ij) = find(d1==min(d1));
    end
end

%% 在feat2中找离feat1的距离满足一定条件的特征,构成匹配
matchInd = zeros(featNum_1 1);
matchDis = zeros(featNum_1 1);
for i = 1 : featNum_1
    d = zeros(1featNum_2);
    for k = 1 : 16
        d(1 : featNum_2) = d(1 : featNum_2) +dist{k}( minposition(ki)  minposition2(k1 : featNum_2) );
    end
    matchDis(i) = min(d);
    [v ind] = sort(d);
    if v(1) / v(2) <= 0.64
        matchInd(i) = ind(1);
    end
end


%% 可视化
[row col cn] = siz

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2017-11-15 15:42  test images\
     文件      243673  2013-12-05 23:17  test images\ukbench00000.jpg
     文件      696244  2014-03-16 05:45  test images\ukbench00000.jpg.dsift
     文件      246526  2013-12-05 23:17  test images\ukbench00001.jpg
     文件      545332  2014-03-16 05:45  test images\ukbench00001.jpg.dsift
     文件      218653  2013-12-05 23:17  test images\ukbench00002.jpg
     文件      741028  2014-03-16 05:45  test images\ukbench00002.jpg.dsift
     文件      269422  2013-12-05 23:17  test images\ukbench00003.jpg
     文件      674068  2014-03-16 05:46  test images\ukbench00003.jpg.dsift
     文件      152703  2013-12-05 23:17  test images\ukbench00012.jpg
     文件      154228  2014-03-16 05:46  test images\ukbench00012.jpg.dsift
     文件      155830  2013-12-05 23:17  test images\ukbench00013.jpg
     文件      154948  2014-03-16 05:46  test images\ukbench00013.jpg.dsift
     文件      175983  2013-12-05 23:17  test images\ukbench00014.jpg
     文件      103828  2014-03-16 05:46  test images\ukbench00014.jpg.dsift
     文件      168753  2013-12-05 23:17  test images\ukbench00015.jpg
     文件      107284  2014-03-16 05:46  test images\ukbench00015.jpg.dsift
     文件      153642  2006-10-05 01:11  test images\ukbench00052.jpg
     文件      140404  2014-03-16 05:47  test images\ukbench00052.jpg.dsift
     文件      160703  2006-10-05 01:11  test images\ukbench00053.jpg
     文件      149332  2014-03-16 05:47  test images\ukbench00053.jpg.dsift
     文件      144807  2006-10-05 01:11  test images\ukbench00054.jpg
     文件      153508  2014-03-16 05:47  test images\ukbench00054.jpg.dsift
     文件      151801  2006-10-05 01:11  test images\ukbench00055.jpg
     文件      139252  2014-03-16 05:47  test images\ukbench00055.jpg.dsift
     文件      172114  2006-10-05 01:11  test images\ukbench00080.jpg
     文件      114628  2014-03-16 05:48  test images\ukbench00080.jpg.dsift
     文件      181878  2006-10-05 01:11  test images\ukbench00081.jpg
     文件      135940  2014-03-16 05:48  test images\ukbench00081.jpg.dsift
     文件      154145  2006-10-05 01:11  test images\ukbench00082.jpg
     文件      162436  2014-03-16 05:48  test images\ukbench00082.jpg.dsift
............此处省略13个文件信息

评论

共有 条评论