Code covered by the BSD License  

Highlights from
Demos from "Computer Vision with MATLAB" webinar

image thumbnail

Demos from "Computer Vision with MATLAB" webinar

by

Bruce Tannenbaum

 

22 Apr 2011 (Updated )

Demo files for the "Computer Vision with MATLAB" webinar held on April 19, 2011.

FeatureBasedRegistration.m
%% Feature-Based Registration Demo
% Copyright 2011 The MathWorks, Inc.

%%  Look at source video
implay('shaky_car.avi');

%% Step 1 - Read Images
imgA = im2single(imread('imageA.tif'));
imgB = im2single(imread('imageB.tif'));

cvexShowImagePair(imgA, imgB, 'Frame A', 'Frame B');

%% Step 2 - Collect Salient Points from Each Image

maxPts = 200;
ptThresh = 1e-3;
hCornerDet = vision.CornerDetector( ...
    'Method','Local intensity comparison (Rosen & Drummond)', ...
    'MaximumCornerCount', maxPts, ...
    'CornerThreshold', ptThresh, ...
    'NeighborhoodSize', [9 9]);
pointsA = step(hCornerDet, imgA);
pointsB = step(hCornerDet, imgB);

cvexShowImagePair(imgA, imgB, 'Corners in A', 'Corners in B', 'SingleColor', pointsA, pointsB);

%% Step 3 - Extract Features around each Point
blockSize = 9;
[featuresA, pointsA] = extractFeatures(imgA, pointsA, 'BlockSize', blockSize);
[featuresB, pointsB] = extractFeatures(imgB, pointsB, 'BlockSize', blockSize);

%% Step 4 - Select Correspondences Between Points
% Match features which were found in the current and the previous frames
indexPairs = matchFeatures(featuresA, featuresB, 'Metric', 'SSD');
numMatchedPoints = cast(size(indexPairs, 2), 'int32');
pointsA = pointsA(:, indexPairs(1, :));
pointsB = pointsB(:, indexPairs(2, :));

cvexShowMatches(imgA, imgB, pointsA, pointsB, 'A', 'B', 'RC');

%% Step 5 - Estimatate Geometric Transformation
% RANSAC offers robust estimation of the transformation parameters by
% randomly sampling from the matched features to identify and remove
% outliers for improved results.
doc 'estimate geometric transformation'

%%
hGTE = vision.GeometricTransformEstimator(...
                        'Transform','Affine',...
                        'InlierOutputPort',true,...
                        'NumRandomSamplings', 1000);
hGT = vision.GeometricTransformer;
hGTPrj = vision.GeometricTransformer;
%
% Run multiple RANSAC trials
nRansacTrials = 3;
Ts = cell(1,nRansacTrials);
costs = zeros(1,nRansacTrials);
nPts = int32(size(pointsA,2));
inliers = cell(1,nRansacTrials);
for j=1:nRansacTrials
    % Estimate affine transform
    [Ts{j},inliers{j}] = step(hGTE, pointsB, pointsA, nPts);
    
    % Warp image and compute error metric.
    imgBp = step(hGT, imgB, Ts{j});
    costs(j) = sum(sum(imabsdiff(imgBp, imgA)));
end
%
[~,ix] = min(costs);
imgBp = step(hGT, imgB, Ts{ix});
pointsBp = Ts{ix} * [single(pointsB); ones(1,size(pointsB,2))];
H = [Ts{ix}; 0 0 1];
%
cvexShowMatches(imgA, imgB, pointsA(:,inliers{ix}), ...
    pointsB(:,inliers{ix}), 'A', 'B');

Contact us