您的位置:首页 > 编程语言 > MATLAB

Matlab CV ToolBox的使用之matchFeatures

2016-05-18 20:41 671 查看

Matlab的自带说明:

matchFeatures Find matching features

INDEX_PAIRS = matchFeatures(FEATURES1, FEATURES2)

返回INDEX_PAIRS为[P,2]数组,包含最可能相关的特征点的数组。FEATURES1为[M1,N]的数组,FEATURES2为[M2,N]的数组,都可以是由FREAK描述子产生的二值特征。

[INDEX_PAIRS, MATCH_METRIC] = matchFeatures(FEATURES1, FEATURES2, ...)

除了上述返回值,还返回和INDEX_PAIRS相关的度量值MATCH_METRIC,他是[P,1]的数组。

[INDEX_PAIRS, MATCH_METRIC] = matchFeatures(...,Name, Value) specifies
附加name-value可以为:

'Method' 两个特征向量之间的距离小于MatchThreshold设置的阈值时他们为匹配的。有三种:

‘Threshold’:只是用匹配阈值。每个特征点能返回多个匹配点。

‘NearestNeighborSymmetric’:使用匹配阈值且只返回一个匹配点。只选择最近邻的匹配点。

'NearestNeighborRatio':使用匹配且消除了模糊匹配。只有当两特征点之间的最近距离满足一定比率,才符合。比率为特征点到第一个最近邻和到第二个最近邻之间的比值。

Default: 'NearestNeighborRatio'

‘MatchThreshold’ 0 < T <= 100。大于百分之T的特征点确定为匹配点。减小T可获得更多匹配。

Default: 10.0 for binary feature vectors (二分特征向量)

1.0 otherwise

'MaxRatio' 0 < R <= 1,较小R能得到更多匹配点。只能和'NearestNeighborRatio' method一起使用。

Default: 0.6

'Metric' 字符串,当FEATURES1和FEATURES2是binaryFeatures式不可用。

'SAD' : Sum of absolute differences

'SSD' : Sum of squared differences

'normxcorr' : Normalized cross-correlation

Default: 'SSD'

注意:当FATURES1和FEATURES2是binaryFeatures时,使用Hamming 距离来计算相似的度量。

'Prenormalized' 逻辑标量。TRUE表示FEATURES1和FEATURES2在匹配前已经正规化到单元向量。设置FALSE会导致FEATURES1和FEATURES2的正规化。注意,如果匹配前没有正规化将产生错误结果。FEATURES1和FEATURES2是binaryFeature的时候,参数不可用。

Default: false

注意:

% Notes

% -----

% The range of values of MATCH_METRIC varies as a function of the feature

% matching metric being used. Prior to computation of SAD and SSD

% metrics, the feature vectors are normalized to unit vectors. The table

% below summarizes the metric ranges and perfect match values:

%

% Metric Range Perfect Match Value

% ---------- ------------------------------- -------------------

% SAD [0, 2*sqrt(size(FEATURES1, 1))] 0

% SSD [0, 4] 0

% normxcorr [-1, 1] 1

%

% Hamming [0, FEATURES1.NumBits] 0

%

matlab:函数文档

%matchFeatures Find matching features

% INDEX_PAIRS = matchFeatures(FEATURES1, FEATURES2) returns a P-by-2

% matrix, INDEX_PAIRS, containing indices to the features most likely to

% correspond between the two input feature matrices. The function takes

% two inputs, FEATURES1, an M1-by-N matrix, and FEATURES2, an M2-by-N

% matrix. FEATURES1 and FEATURES2 can also be binaryFeatures objects in

% the case of binary descriptors produced by the FREAK descriptor.

%

% [INDEX_PAIRS, MATCH_METRIC] = matchFeatures(FEATURES1, FEATURES2, ...)

% also returns the metric values that correspond to the associated

% features indexed by INDEX_PAIRS in a P-by-1 matrix MATCH_METRIC.

%

% [INDEX_PAIRS, MATCH_METRIC] = matchFeatures(...,Name, Value) specifies

% additional name-value pairs described below:

%

% 'Method' A string used to specify the matching strategy. All

% three methods use the match threshold. Two feature

% vectors match when the distance between them is less

% than the threshold set by the MatchThreshold

% parameter. Set the method to one of the following:

%

% 'Threshold': Only uses the match threshold. This

% method can return more than one match for each

% feature.

%

% 'NearestNeighborSymmetric': Only returns unique

% matches in addition to using the match threshold.

% A feature vector only matches to its nearest

% neighbor in the other feature set.

%

% 'NearestNeighborRatio': Eliminates ambiguous matches

% in addition to using the match threshold. A

% feature vector is matched to its nearest neighbor

% in the other feature set, when the nearest

% neighbor satisfies a ratio test. The ratio test

% compares the distances from the feature vector to

% its first and second nearest neighbors in the

% other feature set.

%

% Default: 'NearestNeighborRatio'

%

% 'MatchThreshold' A scalar T, 0 < T <= 100, specifying a threshold

% for selecting the strongest matches. Matches having

% metrics more than T percent from a perfect match

% are rejected. Increase T to return more matches.

%

% Default: 10.0 for binary feature vectors

% 1.0 otherwise

%

% 'MaxRatio' A scalar R, 0 < R <= 1, specifying a ratio threshold

% for rejecting ambiguous matches. Increase R to return

% more matches. This parameter is used only with

% 'NearestNeighborRatio' method.

%

% Default: 0.6

%

% 'Metric' A string used to specify the feature matching

% metric. This parameter is not applicable when

% FEATURES1 and FEATURES2 are binaryFeatures objects.

% Possible values are:

% 'SAD' : Sum of absolute differences

% 'SSD' : Sum of squared differences

% 'normxcorr' : Normalized cross-correlation

%

% Default: 'SSD'

%

% Note: When FEATURES1 and FEATURES2 are binaryFeatures

% objects, Hamming distance is used to compute

% the similarity metric.

%

% 'Prenormalized' A logical scalar. Use true to indicate that FEATURES1

% and FEATURES2 are already normalized to unit vectors

% prior to matching. Setting this flag to false will

% result in normalizing FEATURES1 and FEATURES2. Note

% that setting this flag to true when features are not

% normalized in advance will produce wrong results.

% This parameter is not applicable when FEATURES1 and

% FEATURES2 are binaryFeatures objects.

%

% Default: false

%

% Notes

% -----

% The range of values of MATCH_METRIC varies as a function of the feature

% matching metric being used. Prior to computation of SAD and SSD

% metrics, the feature vectors are normalized to unit vectors. The table

% below summarizes the metric ranges and perfect match values:

%

% Metric Range Perfect Match Value

% ---------- ------------------------------- -------------------

% SAD [0, 2*sqrt(size(FEATURES1, 1))] 0

% SSD [0, 4] 0

% normxcorr [-1, 1] 1

%

% Hamming [0, FEATURES1.NumBits] 0

%

% This function changed in the release R2012b. Previous versions

% used a different matching strategy. If you need the same results

% produced by the previous implementation, use

% matchFeatures(FEATURES1, FEATURES2, 'Method', 'NearestNeighbor_old',...).

%

% Class Support

% -------------

% FEATURES1 and FEATURES2 can be logical, int8, uint8, int16, uint16,

% int32, uint32, single, double, or binaryFeatures object.

%

% The output class of INDEX_PAIRS is uint32. MATCH_METRIC is double when

% FEATURES1 and FEATURES2 are double. Otherwise, it is single.

%

% [matchLoc1 matchLoc2] = siftMatch(img1, img2)
% 初匹配用Matlab自带的函数:matchFeatures(feature1,feature2,Name,Value);
%
% This function reads two images, finds their SIFT features, and
%   displays lines connecting the matched keypoints.  A match is accepted
%   only if its distance is less than distRatio times the distance to the
%   second closest match.
% It returns the matched points of both images, matchLoc1 = [x1,y1;x2,y2;...]
%
% Example: match('scene.pgm','book.pgm');

function [matchLoc1,matchLoc2] = siftMatch(img1, img2)

% load matchdata
% load img1data
% load img2data
%{,
% Find SIFT keypoints for each image
[des1, loc1] = sift(img1);
[des2, loc2] = sift(img2);
% save img1data des1 loc1,des是特征算子,loc是坐标和~
% save img2data des2 loc2
% 'Prenormalized'
desPairs = matchFeatures(des1,des2,...
'MaxRatio',0.601,...
'MatchThreshold',11,...
'Prenormalized',true);
matched1Points = loc1(desPairs(:,1),:);
matched2Points = loc2(desPairs(:,2),:);
figure;
showMatchedFeatures(img1, img2, matched1Points(:,1:1:2), ...
matched2Points(:,1:1:2), 'montage');
title('Putatively Matched Points (Including Outliers)');

x1 = matched1Points(:,2);
x2 = matched2Points(:,2);
y1 = matched1Points(:,1);
y2 = matched2Points(:,1);

matchLoc1 = [x1,y1];
matchLoc2 = [x2,y2];

%% 对这一段代码进行修改
% % For efficiency in Matlab, it is cheaper to compute dot products between
% %  unit vectors rather than Euclidean distances.  Note that the ratio of
% %  angles (acos of dot products of unit vectors) is a close approximation
% %  to the ratio of Euclidean distances for small angles.
% %在Matlab中,dot的运算比欧几里德的减法运算的效率更高。
% % distRatio: Only keep matches in which the ratio of vector angles from the
% %   nearest to second nearest neighbor is less than distRatio.
% distRatio = 0.6;
%
% % For each descriptor in the first image, select its match to second image.
% %在image1中寻找与image2相匹配的点
% des2t = des2';                          % Precompute matrix transpose
% matchTable = zeros(1,size(des1,1));
% for i = 1 : size(des1,1)
%    dotprods = des1(i,:) * des2t;        % Computes vector of dot products
%    [vals,indx] = sort(acos(dotprods));  % Take inverse cosine and sort results
%    %采用反余弦和结果排序,vals是结果排序的值,index是反余弦的值
%
%    % Check if nearest neighbor has angle less than distRatio times 2nd.
%    if (vals(1) < distRatio * vals(2))
%       matchTable(i) = indx(1);
%    else
%       matchTable(i) = 0;
%    end
% end
% % save matchdata matchTable
% %}
%
% % Create a new image showing the two images side by side.
% %创建一个新的图像,把两张图片都放在其中
% img3 = appendimages(img1,img2);
%
% % Show a figure with lines joining the accepted matches.
% figure('Position', [100 100 size(img3,2) size(img3,1)]);
% colormap('gray');
% imagesc(img3);
% hold on;
% cols1 = size(img1,2);
% for i = 1: size(des1,1)
%   if (matchTable(i) > 0)
%     line([loc1(i,2) loc2(matchTable(i),2)+cols1], ...
%          [loc1(i,1) loc2(matchTable(i),1)], 'Color', 'c');
%   end
% end
% hold off;
% num = sum(matchTable > 0);
% fprintf('Found %d matches.\n', num);
%
% idx1 = find(matchTable);
% idx2 = matchTable(idx1);
% x1 = loc1(idx1,2);
% x2 = loc2(idx2,2);
% y1 = loc1(idx1,1);
% y2 = loc2(idx2,1);
%
% matchLoc1 = [x1,y1];
% matchLoc2 = [x2,y2];

end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: