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;
 | 
			
		||||
    hold on
 | 
			
		||||
| 
						 | 
				
			
			@ -6,10 +10,9 @@ function plotCylinderSamples(cylinders, fieldSize)
 | 
			
		|||
    num = size(cylinders, 1);
 | 
			
		||||
 | 
			
		||||
    sampleDensity = 120;
 | 
			
		||||
    figure
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    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 = X + cylinders{i}.centroid.x;
 | 
			
		||||
| 
						 | 
				
			
			@ -24,6 +27,8 @@ function plotCylinderSamples(cylinders, fieldSize)
 | 
			
		|||
    axis equal
 | 
			
		||||
    axis([0, fieldSize.x, 0, fieldSize.y, 0, 20]);
 | 
			
		||||
        
 | 
			
		||||
    grid on
 | 
			
		||||
    
 | 
			
		||||
    if ~holdstate
 | 
			
		||||
        hold off
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue