Depth Estimation Using Stereo Imaging in Matlab

January 8, 2018 | Author: Sayan Seth | Category: Imaging, Vision, Areas Of Computer Science, Computer Vision, Natural Philosophy
Share Embed Donate


Short Description

Depth Estimation Using Stereo Imaging in Matlab...

Description

Depth Estimation Using Stereo Imaging in Matlab Object Tracking in 3D

Disparity Equation P(X,Y,Z)

Stereo system with parallel optical axes

Depth

Disparity: dx = xr - xl

B Z D f dx Image plane f = focal length

Image plane pl(xl,yl)

pr(xr,yr)

Optical Center Ol

f = focal length

Optical Center Or B = Baseline

LEFT CAMERA

RIGHT CAMERA

Disparity vs. Baseline P(X,Y,Z)

Stereo system with parallel optical axes

Depth

Disparity dx = xr - xl

B Z D f dx Image plane f = focal length

Image plane pl(xl,yl)

Optical Center Ol

pr(xr,yr)

f = focal length

Optical Center Or B = Baseline

LEFT CAMERA

RIGHT CAMERA

Depth Accuracy › Given the same image localization error – Angle of cones in the figure › Depth Accuracy (Depth Resolution) vs. Baseline – Depth Error  1/B (Baseline length) – PROS of Longer baseline, › better depth estimation

Ol

Two viewpoints Or

Z1 Z2

Z1

– CONS › smaller common FOV

› Depth Accuracy (Depth Resolution) vs. Depth – Disparity (>0)  1/ Depth – Depth Error  Depth2 – Nearer the point, better the depth estimation

› An Example – f = 16 x 512/8 pixels, B = 0.5 m – Depth error vs. depth

Z2>Z1

Absolute error

Z2 Z   (dx) fB Relative error Z Z   (dx) Z fB

Depth from disparity image I(x,y)

Disparity map D(x,y)

image I´(x´,y´)

(x´,y´)=(x+D(x,y), y) So if we could find the corresponding points in two images, we could estimate relative depth…

Find the corners. points1 = detectHarrisFeatures(I1); points2 = detectHarrisFeatures(I2);

Extract the neighborhood features. [features1,valid_points1] = extractFeatures(I1,points1); [features2,valid_points2] = extractFeatures(I2,points2);

Match the features. indexPairs = matchFeatures(features1,features2);

Retrieve the locations of the corresponding points for each image. matchedPoints1 = valid_points1(indexPairs(:,1),:); matchedPoints2 = valid_points2(indexPairs(:,2),:);

Visualize the corresponding points. You can see the effect of translation between the two images despite several erroneous matches. figure; showMatchedFeatures(I1,I2,matchedPoints1,matchedPoints2);

Camera parameters Camera frame 2

Extrinsic parameters: Camera frame 1  Camera frame 2

Camera frame 1

Intrinsic parameters: Image coordinates relative to camera  Pixel coordinates

• Extrinsic parameters: rotation matrix and translation vector • Intrinsic parameters: focal length, pixel sizes (mm), image center point, radial distortion parameters

load('webcamsSceneReconstruction.mat');

Read in the stereo pair of images. I1 = imread('sceneReconstructionLeft.jpg'); I2 = imread('sceneReconstructionRight.jpg');

Rectify the images. [J1, J2] = rectifyStereoImages(I1,I2,stereoParams);

Display the images after rectification. figure imshow(stereoAnaglyph(I1,I2));

Compute the disparity. disparityMap = disparity(rgb2gray(J1), rgb2gray(J2)); figure imshow(disparityMap,[0,64],'InitialMagnification',50);

xyzPoints = reconstructScene(disparityMap,stereoParams); points3D = xyzPoints; points3D = points3D ./ 1000; ptCloud = pointCloud(points3D, 'Color', J1); % Create a streaming point cloud viewer player3D = pcplayer([-3, 3], [-3, 3], [0, 8], 'VerticalAxis', 'y', ... 'VerticalAxisDir', 'down'); % Visualize the point cloud view(player3D, ptCloud);

%Undistort the images. I1 = undistortImage(I1,stereoParams.CameraParameters1); I2 = undistortImage(I2,stereoParams.CameraParameters2); [nBW1,maskedImage1] = createMask3(I1); [nBW2,maskedImage2] = createMask3(I2); BW1 = bwareaopen(nBW1,600); BW2 = bwareaopen(nBW2,600); stats1 = regionprops(BW1,'Centroid','BoundingBox'); stats2 = regionprops(BW2,'Centroid','BoundingBox'); bc1 = stats1.Centroid; bc2 = stats2.Centroid; bb1 = stats1.BoundingBox; bb2 = stats2.BoundingBox;

%Compute the distance from camera 1 to the face. point3d = triangulate(bc1, bc2, stereoParams); distanceInMeters = norm(point3d)/1000;

colorDevice = imaq.VideoDevice('kinect',1); depthDevice = imaq.VideoDevice('kinect',2); step(colorDevice); step(depthDevice); colorImage = step(colorDevice); depthImage = step(depthDevice); ptCloud = pcfromkinect(depthDevice, depthImage, colorImage); % Initialize a player to visualize 3-D point cloud data. The axis is % set appropriately to visualize the point cloud from Kinect. player = pcplayer(ptCloud.XLimits, ptCloud.YLimits, ptCloud.ZLimits,... 'VerticalAxis', 'y', 'VerticalAxisDir', 'down'); xlabel(player.Axes, 'X (m)'); ylabel(player.Axes, 'Y (m)'); zlabel(player.Axes, 'Z (m)');

view(player, ptCloud);

ptCloud = pcfromkinect(depthDevice, depthImage, colorImage);

XYZPoints

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF