source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/image3dstiching/Refinement/OcclusionSurfMaches.m @ 173

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

Added original make3d

File size: 8.6 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 [] = OcclusionRemoveRefineMent(defaultPara, Wrlname, PairList, PostFixStrAfter, Type)
40
41% This function do three thing
42% 1) detect the occlusion from the current model
43% 2) decide redundent plane
44% 3) Re-Render by not rendering the redundent plane information
45
46% Input:
47% 1) defaultPara - all parameter share for the whole stitching3d folder
48%       2) Wrlname - the name of the model, different by the PairList
49%       3) PairList - the linearly order of image that been added to the model
50
51% Fixed constant --- need to be put in defaultPara by Min later
52NegI = diag([1 1 -1]);
53PostFixStr = 'NonMono';%'NonMonoOccluMatched'
54if nargin <4
55    PostFixStrAfter = 'OccluRemove';
56end   
57DisCtsThre = 0.1; % fractional error
58OcclusionRatioThre = 1.1;
59SurfFlag = 0; % default not using surf Feature point to find occlusion
60if strcmp( lower(Type), 'matches')
61        SurfFlag = 1;
62end
63
64% 1) Run occlusion detection and Matcheing for every pair of images
65
66ImgList = unique(PairList);
67NumImg = length(ImgList);
68
69% copy the ImgInfo of each image to another "PostFixStrAfter".mat file
70for i = 1:NumImg
71        load([defaultPara.Fdir '/data/' ImgList{i} '/' Wrlname '_' ImgList{i} '_' PostFixStr '.mat']);
72        save([defaultPara.Fdir '/data/' ImgList{i} '/' Wrlname '_' ImgList{i} '_' PostFixStrAfter '.mat'],'model');     
73end
74
75%       detect occlusion for every pair of image
76for i = 1:NumImg
77        for j = (i+1):NumImg
78
79%       [Img1Index] = ImgInfoIndexFromName(ImgInfo, ImgList{i});
80%       [Img2Index] = ImgInfoIndexFromName(ImgInfo, ImgList{j});
81       
82        [ImgInfo1 ImgInfo2 Img1Index Img2Index Pair GlobalScale] = ... % What to do with Pairs haven't been matched ???????????????????
83                LoadDataForFindOcclu(defaultPara, Wrlname, ImgList{i}, ImgList{j}, ...
84                                     0, PostFixStrAfter); % load all imformation needed for occlusion detection
85
86    % Define variables
87        H = 2274;
88        V = 1704;
89        Img1 = ImgInfo1.ExifInfo.IDName;
90        Img2 = ImgInfo2.ExifInfo.IDName;
91        I1=imreadbw([defaultPara.Fdir '/pgm/' Img1 '.pgm']); % function from sift
92        I2=imreadbw([defaultPara.Fdir '/pgm/' Img2 '.pgm']); % function from sift               
93        ImgScale1 = size(I1);
94        ImgScale2 = size(I2);
95   
96    % time consuming about 5mins
97    if ~defaultPara.Flag.FlagPreloadOccluDetect
98        [PointPix1 PointDepth1 FaceSetPickedIND1 POriReprojM1 FieldOccluPix1 OccluDist1 OccluedFaceSetIND1 ...
99            PointPix2 PointDepth2 FaceSetPickedIND2 POriReprojM2 FieldOccluPix2 OccluDist2 OccluedFaceSetIND2] = ...
100            FindOccluPair(defaultPara, ImgInfo1, ImgInfo2, Pair, GlobalScale, SurfFlag); % detect occlsion (use Ray as detector not the surf Features)
101        % data Struction define:
102        % PointPix PointDepth FaceSetPickedIND POriReprojM FieldOccluPix OccluDist OccluedFaceSetIND
103        % -- allof the size that single ray pass through both FaceSet
104        % FaceSetPickedIND1 used in DepthMap size or surfFeature size
105        % OccluedFaceSetIND1 used in DepthMap size
106        if SurfFlag
107            save([ defaultPara.Fdir '/data/' Img1 '_' Img2 '_OccluDetect_Match.mat'],...
108                'PointPix1','PointDepth1','FaceSetPickedIND1','POriReprojM1','FieldOccluPix1','OccluDist1','OccluedFaceSetIND1',...
109                'PointPix2','PointDepth2','FaceSetPickedIND2','POriReprojM2','FieldOccluPix2','OccluDist2','OccluedFaceSetIND2');
110        else   
111            save([ defaultPara.Fdir '/data/' Img1 '_' Img2 '_OccluDetect_Ray.mat'],...
112                'PointPix1','PointDepth1','FaceSetPickedIND1','POriReprojM1','FieldOccluPix1','OccluDist1','OccluedFaceSetIND1',...
113                'PointPix2','PointDepth2','FaceSetPickedIND2','POriReprojM2','FieldOccluPix2','OccluDist2','OccluedFaceSetIND2');
114        end   
115    else
116        if SurfFlag
117            load([defaultPara.Fdir '/data/' Img1 '_' Img2 '_OccluDetect_Match.mat']);
118        else   
119            load([defaultPara.Fdir '/data/' Img1 '_' Img2 '_OccluDetect_Ray.mat']);
120        end   
121    end       
122
123        % Define occlusion if OccluDist > CentainThreshold
124        Mask1 = PointDepth1./OccluDist1 > OcclusionRatioThre;%defaultPara.OccluDistThre;
125        Mask2 = PointDepth2./OccluDist2 > OcclusionRatioThre;%defaultPara.OccluDistThre;
126if false
127        % Action: find new matches or decide plane to remove given the occlusion infomation
128        switch lower(Type)
129       
130        case 'matches'
131                MatchPointsGivenOcclusion(defaultPara, ImgScale1, ImgScale2, Img1, Img2, Img1Index, Img2Index, Pair,  ...
132                        POriReprojM1(:,Mask1), FieldOccluPix1(:,Mask1), FaceSetPickedIND1(:,Mask1), ...
133                        POriReprojM2(:,Mask2), FieldOccluPix2(:,Mask2), FaceSetPickedIND2(:,Mask2) );   
134        case 'Remove'
135                RemovePlaneGivenOcclusion(defaultPara, ImgInfo1, ImgInfo2, Pair, GlobalScale, ...
136                        FaceSetPickedIND1, FaceSetPickedIND1, FaceSetPickedIND2, OccluedFaceSetIND2, Mask1, Mask2);
137    end
138end
139
140    end
141       
142end
143
144% 2) Render of each image individiually
145
146for i = 1:NumImg
147       
148%       Data preparing and ReInfernece
149    Default.Wrlname{1} = [Wrlname '_' ImgList{i} '_' PostFixStrAfter];   
150    Default.filename{1} = ['../' ImgList{i}];
151    load([defaultPara.Fdir '/data/' ImgList{i} '/' Wrlname '_' ImgList{i} '_' PostFixStrAfter '.mat']);
152    Default.OutPutFolder = [ defaultPara.OutPutFolder ImgList{i} '/'];
153       
154    if false
155        DiffHori = conv2(model.PlaneParaInfo.FitDepth, [1 -1], 'valid');
156        DiffVert = conv2(model.PlaneParaInfo.FitDepth, [1; -1], 'valid');
157        maskH = [ (DiffHori./model.PlaneParaInfo.FitDepth(:,2:end) > DisCtsThre) zeros(size(model.PlaneParaInfo.FitDepth,1),1)];
158        maskH(end,:) = 0;
159        maskV = [ (DiffVert./model.PlaneParaInfo.FitDepth(2:end,:) > DisCtsThre); zeros(1, size(model.PlaneParaInfo.FitDepth,2))];
160        maskV(:,end) = 0;
161        model.PlaneParaInfo.SupOri(logical(  maskH) ) = 0;
162        model.PlaneParaInfo.SupOri(logical(  maskV) ) = 0;
163    end
164
165        WrlFacestHroiReduce(model.PlaneParaInfo.Position3DFited, model.PlaneParaInfo.PositionTex, model.PlaneParaInfo.SupOri, ...
166                Default.filename{1}, Default.Wrlname{1}, ...
167                Default.OutPutFolder, 0, 0);
168%       SingleImgReInference(defaultPara, model, ImgList{i}, LoadModelStatus(defaultPara.Fdir, Wrlname, ImgList{i}, 'GroundLevel'));
169   
170%   Build Meta Wrl file
171
172    Path = [ defaultPara.OutPutFolder Wrlname '_' PostFixStrAfter '.wrl'];
173    InLinePath = ['./'  ImgList{i} '/' Default.Wrlname{1} '.wrl'];
174    R = LoadModelStatus( defaultPara.Fdir, Wrlname, ImgList{i}, 'R');
175    Q = Rotation2Q(NegI*R*NegI);% for Wrl (-) z component;
176    if any(isnan(Q))
177        Q = zeros(4,1);
178    end
179    % ===============================
180    T = LoadModelStatus( defaultPara.Fdir, Wrlname, ImgList{i}, 'T');
181    WRLT = T;
182    WRLT(3) = -WRLT(3);% for Wrl (-) z component;
183    Scale = LoadModelStatus(defaultPara.Fdir, Wrlname, ImgList{i}, 'Scale');
184    if i == 1
185        BuildVrmlMetaModel(1, defaultPara.OutPutFolder, Path, InLinePath, Q, WRLT, repmat(Scale,3,1));
186    else
187        BuildVrmlMetaModel(0, defaultPara.OutPutFolder, Path, InLinePath, Q, WRLT, repmat(Scale,3,1));
188    end
189end
190
191return;
Note: See TracBrowser for help on using the repository browser.