source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/image3dstiching/Occlu/FindOccluRegion.m @ 37

Last change on this file since 37 was 37, checked in by (none), 14 years ago

Added original make3d

File size: 9.3 KB
Line 
1% *  This code was used in the following articles:
2% *  [1] Learning 3-D Scene Structure from a Single Still Image,
3% *      Ashutosh Saxena, Min Sun, Andrew Y. Ng,
4% *      In ICCV workshop on 3D Representation for Recognition (3dRR-07), 2007.
5% *      (best paper)
6% *  [2] 3-D Reconstruction from Sparse Views using Monocular Vision,
7% *      Ashutosh Saxena, Min Sun, Andrew Y. Ng,
8% *      In ICCV workshop on Virtual Representations and Modeling
9% *      of Large-scale environments (VRML), 2007.
10% *  [3] 3-D Depth Reconstruction from a Single Still Image,
11% *      Ashutosh Saxena, Sung H. Chung, Andrew Y. Ng.
12% *      International Journal of Computer Vision (IJCV), Aug 2007.
13% *  [6] Learning Depth from Single Monocular Images,
14% *      Ashutosh Saxena, Sung H. Chung, Andrew Y. Ng.
15% *      In Neural Information Processing Systems (NIPS) 18, 2005.
16% *
17% *  These articles are available at:
18% *  http://make3d.stanford.edu/publications
19% *
20% *  We request that you cite the papers [1], [3] and [6] in any of
21% *  your reports that uses this code.
22% *  Further, if you use the code in image3dstiching/ (multiple image version),
23% *  then please cite [2].
24% * 
25% *  If you use the code in third_party/, then PLEASE CITE and follow the
26% *  LICENSE OF THE CORRESPONDING THIRD PARTY CODE.
27% *
28% *  Finally, this code is for non-commercial use only.  For further
29% *  information and to obtain a copy of the license, see
30% *
31% *  http://make3d.stanford.edu/publications/code
32% *
33% *  Also, the software distributed under the License is distributed on an
34% * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
35% *  express or implied.   See the License for the specific language governing
36% *  permissions and limitations under the License.
37% *
38% */
39function [Region POriReprojM PoccluM OccluDist] = FindOccluRegion(defaultPara, ScaleImg, ITarget, F, TargetPointPix, FieldPointPix, INDTarget, INDField, ModelInfoTarget, ModelInfoField, Pair)
40
41% Function find the closed occlu point and output a region on epipolar line
42% to search for dense match
43
44% find features close to epipoaeline
45
46% initial parameters
47FlagDisp = 1;
48EpipolarThre = 0.1;
49ScaleSlab = 1;
50VertSearchSlab = 0.1;
51HoriSearchSlab = 0.05;
52
53% Initialize Variables
54Region = [];
55POriReprojM= [];
56PoccluM = [];
57OccluDist = [];
58
59% Generate a region for each TargetPointPix point
60NumTargetPointPix = size(TargetPointPix,2);
61for IndexTargetPointPix = 1:NumTargetPointPix
62% iterating over all points in target image
63
64        % Pre-filtering the 3-d points in field image that are far from the ray connecting target point to target image-origin.
65        %closeToRay = true;
66        % depth
67        %[DTargetPick INDTargetPick] = PorjPosi2Depth([Iy Ix], [DepthY DepthX], TargetPointPix(:,IndexTargetPointPix),
68        %                                                               ModelInfoTarget.Model.PlaneParaInfo.FitDepth);
69        % computing epipolar lines
70        EpipolarLinePara = F*[ TargetPointPix(:,IndexTargetPointPix); 1];
71        EpipolarLinePara = EpipolarLinePara / norm(EpipolarLinePara(1:2));     
72        TargetPoint3D = ModelInfoTarget.Model.PlaneParaInfo.Position3DFited(:,INDTarget(:,IndexTargetPointPix));    % 3x1
73
74        %FieldPoint3D = ModelInfoField.Model.PlaneParaInfo.Position3DFitted;    % 55x305x3
75       
76        % finding the distance to the line
77
78        % Find the RePojection of the TargetPick Point in Field-Camera
79        x_calib = inv(defaultPara.InrinsicK1)*[ TargetPointPix(:,IndexTargetPointPix); 1];
80        ray = x_calib/norm(x_calib);
81        POriReproj =  defaultPara.InrinsicK2*(Pair.R*( ray*ModelInfoTarget.Model.PlaneParaInfo.FitDepth( INDTarget(:,IndexTargetPointPix) )) + Pair.T);
82%         ModelInfoTarget.Model.PlaneParaInfo.Position3DFited(:,INDTarget(:
83%         ,IndexTargetPointPix))
84        POriReproj = POriReproj(1:2,:)./POriReproj(3,:);
85        % modify the POriReproj to the closest point in the image
86        % First check Horizontal then check Vertical
87        LineVector = [ EpipolarLinePara(2) -EpipolarLinePara(1)];
88        if POriReproj(2) > ScaleImg(2) % make POriReproj(2) = ScaleImg(2)
89                shift = (ScaleImg(2) - POriReproj(2))/LineVector(2);
90                POriReproj(1) = POriReproj(1) + shift*LineVector(1);
91                POriReproj(2) = ScaleImg(2);
92        elseif POriReproj(2) < 1
93                shift = (1 - POriReproj(2))/LineVector(2);
94                POriReproj(1) = POriReproj(1) + shift*LineVector(1);
95                POriReproj(2) = 1;
96        end
97       
98        if POriReproj(1) > ScaleImg(1) % make POriReproj(1) = ScaleImg(1)
99                shift = (ScaleImg(1) - POriReproj(1))/LineVector(1);
100                POriReproj(2) = POriReproj(2) + shift*LineVector(2);
101                POriReproj(1) = ScaleImg(1);
102        elseif POriReproj(1) < 1
103                shift = (1 - POriReproj(1))/LineVector(1);
104                POriReproj(2) = POriReproj(2) + shift*LineVector(2);
105                POriReproj(1) = 1;
106        end
107
108        if abs(EpipolarLinePara' * [POriReproj ; ones(1, 1)]) > 0.1
109                disp('error of POriReproj');
110        end
111               
112        % Find the ReProjection of the origion of Target camer in Field camera
113        %if Pair.T(3) < 0
114
115        %else
116
117        %end
118
119        Mask = abs(EpipolarLinePara' *  [ FieldPointPix; ones(1, size(FieldPointPix,2))]) <= EpipolarThre*max(ScaleImg);
120
121    FieldPoint3D = ModelInfoField.Model.PlaneParaInfo.Position3DFited(:,INDField(Mask));        % 3 x NPoints % inFeild coordinate
122        FieldPointPixMask = FieldPointPix(:, Mask);
123        % change FieldPoint3D into Target Coordinate
124        R_f_t = Pair.R';
125        T_f_t = -Pair.R'*Pair.T;
126        FieldPoint3D = R_f_t*FieldPoint3D + repmat( T_f_t, 1, size(FieldPoint3D,2)); % now in Target coordinate
127   
128    % find if the points that occlude
129   
130    % first find the distance of all the point from the target-origi ray
131    if ~isempty(FieldPoint3D)
132        u = TargetPoint3D' * FieldPoint3D / (TargetPoint3D' * TargetPoint3D);
133        distances = sqrt( sum( ( repmat(u,[3,1]) .* repmat(TargetPoint3D,[1,size(FieldPoint3D,2)]) - FieldPoint3D).^2 ,1));
134        [ V occludingPointsMask] = min(distances);
135%         occludingPointsMask = distances < 0.1;    % MAGIC number. 1 meter in world units
136    else
137        occludingPointsMask = [];
138    end   
139   
140    % ============
141    % check the plan parameter to make sure alpha'*x - 1 > 0
142    % check is the occlusion reprojection has the same planeparameter index
143    % ================
144   
145    if ~isempty(occludingPointsMask) && sum(occludingPointsMask) ~=0% occludsion case
146        candidateFieldPoints3D = FieldPointPixMask(:,occludingPointsMask);
147        candidateU = u(occludingPointsMask); % fraction of TargetPoint3D
148        [tmp, IND] = min(candidateU);
149        tmp = tmp*norm(TargetPoint3D); % change to real unit meters
150    %  if tmp < ModelInfoTarget.Model.PlaneParaInfo.FitDepth(INDTarget(:,IndexTargetPointPix))
151   
152        % find the closest occlusion to camera-Target origin.
153        %[Pocclu] = ClosetOcclusion( defaultPara, ScaleImg, Pair, ModelInfoTarget, ...
154        %                       TargetPointPix(:,IndexTargetPointPix), INDTarget(:,IndexTargetPointPix), ModelInfoField, FieldPointPix(:, Mask), INDField(Mask));
155
156        %if closeToRay
157                % consider intersection with the field superpixel of that point
158        %end
159       
160    %if ~isempty(Pocclu)
161        % DTargetPick and Pair.T both are rescaled to global scale
162       
163        % Define rectangular region form Pocclu and POriReproj
164        PoccluNearBy = candidateFieldPoints3D(:,IND);
165        if isempty(PoccluNearBy)           
166            disp('error')
167        end
168        % need to Porject PoccluNearBy to the closest position on the epipolar line
169        Pocclu = - ( EpipolarLinePara' *  [ PoccluNearBy; ones(1, 1)])* EpipolarLinePara(1:2) + PoccluNearBy;
170        if Pocclu(2) > ScaleImg(2) % make Pocclu(2) = ScaleImg(2)
171                shift = (ScaleImg(2) - Pocclu(2))/LineVector(2);
172                Pocclu(1) = Pocclu(1) + shift*LineVector(1);
173                Pocclu(2) = ScaleImg(2);
174        elseif Pocclu(2) < 1
175                shift = (1 - Pocclu(2))/LineVector(2);
176                Pocclu(1) = Pocclu(1) + shift*LineVector(1);
177                Pocclu(2) = 1;
178        end
179       
180        if Pocclu(1) > ScaleImg(1) % make Pocclu(1) = ScaleImg(1)
181                shift = (ScaleImg(1) - Pocclu(1))/LineVector(1);
182                Pocclu(2) = Pocclu(2) + shift*LineVector(2);
183                Pocclu(1) = ScaleImg(1);
184        elseif Pocclu(1) < 1
185                shift = (1 - Pocclu(1))/LineVector(1);
186                Pocclu(2) = Pocclu(2) + shift*LineVector(2);
187                Pocclu(1) = 1;
188        end
189   
190        if abs(EpipolarLinePara' * [Pocclu ; ones(1, 1)]) > 0.1
191                disp('error of Pocclu');
192        end
193
194        vari = [[ 0 0 HoriSearchSlab -HoriSearchSlab];...
195                [VertSearchSlab -VertSearchSlab 0 0]]; 
196        vari = vari*max(ScaleImg)*ScaleSlab;
197        MaxV = min(max([Pocclu(2)+vari(2,:) POriReproj(2)+vari(2,:)]),ScaleImg(1));
198        MinV = max(min([Pocclu(2)+vari(2,:) POriReproj(2)+vari(2,:)]),1);
199        MaxH = min(max([Pocclu(1)+vari(1,:) POriReproj(1)+vari(1,:)]),ScaleImg(2));
200        MinH = max(min([Pocclu(1)+vari(1,:) POriReproj(1)+vari(1,:)]),1);
201        %Region = [Region [MaxH; MinH; MaxV; MinV]];
202        Region = [Region [MinH; MaxH; MinV; MaxV]];
203        PoccluM = [PoccluM Pocclu];
204        POriReprojM = [POriReprojM POriReproj];
205        OccluDist =[ OccluDist (ModelInfoTarget.Model.PlaneParaInfo.FitDepth(INDTarget(:,IndexTargetPointPix)) -tmp)];
206     % else
207     %   Region = [Region zeros(4,1)];
208     %   PoccluM = [PoccluM zeros(2,1)];
209     %   POriReprojM = [POriReprojM zeros(2,1)];
210     %   OccluDist = [ OccluDist zeros(1,1)];
211     % end 
212    else % case of no occlusion
213        Region = [Region zeros(4,1)];
214        PoccluM = [PoccluM zeros(2,1)];
215        POriReprojM = [POriReprojM zeros(2,1)];
216        OccluDist = [ OccluDist zeros(1,1)];
217    end
218end
219
220return;
Note: See TracBrowser for help on using the repository browser.