calculate all the visible points from a camera view
parent
9485553d99
commit
5564aea332
|
@ -0,0 +1,64 @@
|
||||||
|
function [visiblePoints, visiblePointsCylinderIdx] = cylinderSampleProjection(K, cameraPose, imageSize, cylinders)
|
||||||
|
% Project sampled points on cylinder to camera frame
|
||||||
|
% Authors: Zhaoyang Lv
|
||||||
|
|
||||||
|
import gtsam.*
|
||||||
|
|
||||||
|
cylinder_num = size(cylinders, 1);
|
||||||
|
|
||||||
|
%camera = SimpleCamera(cameraPose, K);
|
||||||
|
camera = SimpleCamera.Lookat(cameraPose.translation(), cylinders{10}.centroid, Point3([0,0,1]'), K);
|
||||||
|
|
||||||
|
visiblePoints = {};
|
||||||
|
visiblePointsCylinderIdx = [];
|
||||||
|
|
||||||
|
for i = 1:cylinder_num
|
||||||
|
|
||||||
|
point_num = size( cylinders{i}.Points, 1);
|
||||||
|
|
||||||
|
% to check point visibility
|
||||||
|
for j = 1:point_num
|
||||||
|
sampledPoint3 = cylinders{i}.Points{j};
|
||||||
|
measurements2d = camera.project(sampledPoint3);
|
||||||
|
|
||||||
|
% ignore points not visible in the scene
|
||||||
|
if measurements2d.x < 0 || measurements2d.x >= imageSize.x ...
|
||||||
|
|| measurements2d.y < 0 || measurements2d.y >= imageSize.y
|
||||||
|
continue;
|
||||||
|
end
|
||||||
|
|
||||||
|
% ignore points occluded
|
||||||
|
% use a simple math hack to check occlusion:
|
||||||
|
% 1. All points in front of cylinders' surfaces are visible
|
||||||
|
% 2. For points behind the cylinders' surfaces, the cylinder
|
||||||
|
for k = 1:cylinder_num
|
||||||
|
|
||||||
|
rayCameraToPoint = cameraPose.translation().between(sampledPoint3).vector();
|
||||||
|
rayCameraToCylinder = cameraPose.translation().between(cylinders{i}.centroid).vector();
|
||||||
|
rayCylinderToPoint = cylinders{i}.centroid.between(sampledPoint3).vector();
|
||||||
|
|
||||||
|
% Condition 1: all points in front of the cylinders'
|
||||||
|
% surfaces are visible
|
||||||
|
if dot(rayCylinderToPoint, rayCameraToCylinder) < 0
|
||||||
|
visiblePoints{end+1} = sampledPoint3;
|
||||||
|
visiblePointsCylinderIdx = [visiblePointsCylinderIdx, i];
|
||||||
|
continue;
|
||||||
|
end
|
||||||
|
|
||||||
|
% Condition 2
|
||||||
|
projectedRay = dot(rayCameraToCylinder, rayCameraToPoint);
|
||||||
|
if projectedRay > 0
|
||||||
|
rayCylinderToProjected = norm(projectedRay) / norm(rayCameraToPoint) * rayCameraToPoint;
|
||||||
|
if rayCylinderToProjected(1) > cylinders{i}.radius && ...
|
||||||
|
rayCylinderToProjected(2) > cylinders{i}.radius
|
||||||
|
visiblePoints{end+1} = sampledPoint3;
|
||||||
|
visiblePointsCylinderIdx = [visiblePointsCylinderIdx, i];
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -1,4 +1,8 @@
|
||||||
function plotCylinderSamples(cylinders, fieldSize)
|
function plotCylinderSamples(cylinders, fieldSize, figID)
|
||||||
|
% plot the cylinders on the given field
|
||||||
|
% @author: Zhaoyang Lv
|
||||||
|
|
||||||
|
figure(figID);
|
||||||
|
|
||||||
holdstate = ishold;
|
holdstate = ishold;
|
||||||
hold on
|
hold on
|
||||||
|
@ -6,10 +10,9 @@ function plotCylinderSamples(cylinders, fieldSize)
|
||||||
num = size(cylinders, 1);
|
num = size(cylinders, 1);
|
||||||
|
|
||||||
sampleDensity = 120;
|
sampleDensity = 120;
|
||||||
figure
|
|
||||||
|
|
||||||
for i = 1:num
|
for i = 1:num
|
||||||
%base.z = cylinders{i}.centroid.z - cylinders{i}.height/2;
|
|
||||||
[X,Y,Z] = cylinder(cylinders{i}.radius, sampleDensity * cylinders{i}.radius * cylinders{i}.height);
|
[X,Y,Z] = cylinder(cylinders{i}.radius, sampleDensity * cylinders{i}.radius * cylinders{i}.height);
|
||||||
|
|
||||||
X = X + cylinders{i}.centroid.x;
|
X = X + cylinders{i}.centroid.x;
|
||||||
|
@ -24,6 +27,8 @@ function plotCylinderSamples(cylinders, fieldSize)
|
||||||
axis equal
|
axis equal
|
||||||
axis([0, fieldSize.x, 0, fieldSize.y, 0, 20]);
|
axis([0, fieldSize.x, 0, fieldSize.y, 0, 20]);
|
||||||
|
|
||||||
|
grid on
|
||||||
|
|
||||||
if ~holdstate
|
if ~holdstate
|
||||||
hold off
|
hold off
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue