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 | % */
|
---|
39 | function []=FindOccluSnap(k, Ray, RayPorjectImgMapX, RayPorjectImgMapY) % for each image |
---|
40 | |
---|
41 | global GeneralDataFolder ScratchDataFolder LocalFolder ClusterExecutionDirectory... |
---|
42 | ImgFolder VertYNuPatch VertYNuDepth HoriXNuPatch HoriXNuDepth a_default b_default Ox_default Oy_default... |
---|
43 | Horizon_default filename batchSize NuRow_default SegVertYSize SegHoriXSize WeiBatchSize PopUpVertY PopUpHoriX taskName; |
---|
44 | |
---|
45 | % inital parameter setting |
---|
46 | ThreSize = 10; |
---|
47 | StickHori = 0; |
---|
48 | StickVert = 0; |
---|
49 | ClosestDist = 1; |
---|
50 | FarestDist = 80; |
---|
51 | ThreUpDown = 0.5; |
---|
52 | ThreOcclu = 1; |
---|
53 | SE = strel('disk',3); |
---|
54 | SE5 = strel('disk',5); |
---|
55 | ThreVert = 0.5; |
---|
56 | ThreHori = 0.5; |
---|
57 | ThreFar = 15; |
---|
58 | ThrePcik = 0.5; |
---|
59 | ThreOut = 0.3; |
---|
60 | |
---|
61 | % get all the data we need laserDepth Sup MedSup |
---|
62 | depthfile = strrep(filename{k},'img','depth_sph_corr'); % the depth filename |
---|
63 | load([ScratchDataFolder '/Gridlaserdata/' depthfile '.mat']); |
---|
64 | LaserDepth = Position3DGrid(:,:,4); |
---|
65 | clear Position3DGrid; |
---|
66 | % load the CleanedSup |
---|
67 | load([ScratchDataFolder '/data/CleanSup/CleanSup' num2str(k) '.mat']); |
---|
68 | [SegVertYSize, SegHoriXSize] = size(MedSup); |
---|
69 | MedSup = double(MedSup); |
---|
70 | MaxMedSup = max(MedSup(:)); |
---|
71 | Sup = double(Sup); |
---|
72 | % generate the Posi3D |
---|
73 | Posi3D = im_cr2w_cr(LaserDepth,permute(Ray,[2 3 1])); |
---|
74 | % generate the RayPorjectImgMapY and RayPorjectImgMapX to resolution as MedSup |
---|
75 | NewRayPorjectImgMap = Matrix2ImgCo(HoriXNuDepth, VertYNuDepth, [RayPorjectImgMapX(:) RayPorjectImgMapY(:)]); |
---|
76 | NewRayPorjectImgMap = ImgCo2Matrix(SegHoriXSize, SegVertYSize, NewRayPorjectImgMap); |
---|
77 | NewRayPorjectImgMap = reshape(NewRayPorjectImgMap',[2 VertYNuDepth HoriXNuDepth]); |
---|
78 | % read in img |
---|
79 | Img = imresize(imread([GeneralDataFolder '/' ImgFolder '/' filename{k} ],'jpg'), [SegVertYSize SegHoriXSize]); |
---|
80 | |
---|
81 | % generate Straight lines |
---|
82 | [seglist]=edgeSegDetection(Img,k,0); |
---|
83 | Pointer = seglist(:,1) > seglist(:,3); |
---|
84 | temp = seglist(Pointer,1:2); |
---|
85 | seglist(Pointer,1:2) = seglist(Pointer,3:4); |
---|
86 | seglist(Pointer,3:4) = temp; |
---|
87 | edgeIm = zeros(SegVertYSize, SegHoriXSize); |
---|
88 | NuSeg =size(seglist,1); |
---|
89 | for l = 1:NuSeg |
---|
90 | l |
---|
91 | x = (floor(seglist(l,1)):ceil(seglist(l,3)))'; |
---|
92 | if seglist(l,1) ~= seglist(l,3) |
---|
93 | y = round(LineProj(seglist(l,:), x , [])); |
---|
94 | else |
---|
95 | if seglist(l,2) < seglist(l,4) |
---|
96 | y = (floor(seglist(l,2)):ceil(seglist(l,4)))'; |
---|
97 | else |
---|
98 | y = (floor(seglist(l,4)):ceil(seglist(l,2)))' ; |
---|
99 | end |
---|
100 | x = round(LineProj(seglist(l,:), [] , y)); |
---|
101 | end |
---|
102 | index = sub2ind([SegVertYSize SegHoriXSize],y,x); |
---|
103 | edgeIm(index) = l; |
---|
104 | |
---|
105 | if seglist(l,2) < seglist(l,4) |
---|
106 | y = (floor(seglist(l,2)):ceil(seglist(l,4)))'; |
---|
107 | else |
---|
108 | y = (floor(seglist(l,4)):ceil(seglist(l,2)))' ; |
---|
109 | end |
---|
110 | if seglist(l,2) ~= seglist(l,4) |
---|
111 | x = round(LineProj(seglist(l,:), [] , y)); |
---|
112 | else |
---|
113 | x = (floor(seglist(l,1)):ceil(seglist(l,3)))'; |
---|
114 | y = round(LineProj(seglist(l,:), x , [])); |
---|
115 | end |
---|
116 | index = sub2ind([SegVertYSize SegHoriXSize],y,x); |
---|
117 | edgeIm(index) = l; |
---|
118 | end |
---|
119 | figure(400); imagesc(edgeIm); |
---|
120 | |
---|
121 | % Find Spatial Jump Point |
---|
122 | DiffDepthVert = abs(conv2(LaserDepth,[1; -1],'valid')); |
---|
123 | DiffDepthHori = abs(conv2(LaserDepth,[1 -1],'valid')); |
---|
124 | FraDiffDepthVert = DiffDepthVert./ sqrt(LaserDepth(1:(end-1),:) .* LaserDepth(2:end,:) ); |
---|
125 | %FraDiffDepthVert = DiffDepthVert./ min(LaserDepth(1:(end-1),:) , LaserDepth(2:end,:) ); |
---|
126 | OccFraDiffDepthVert = FraDiffDepthVert > ThreVert; |
---|
127 | OccFraDiffDepthVert(LaserDepth(1:(end-1),:) > ThreFar & LaserDepth(2:end,:) > ThreFar) = 0; |
---|
128 | FraDiffDepthHori = DiffDepthHori./ sqrt( LaserDepth(:,1:(end-1)) .* LaserDepth(:,2:end) ); |
---|
129 | %FraDiffDepthHori = DiffDepthHori./ min( LaserDepth(:,1:(end-1)) , LaserDepth(:,2:end) ); |
---|
130 | |
---|
131 | OccFraDiffDepthHori = FraDiffDepthHori > ThreHori; |
---|
132 | OccFraDiffDepthHori(LaserDepth(:,1:(end-1)) > ThreFar & LaserDepth(:,2:end) > ThreFar) = 0; |
---|
133 | OccFarDiffDepthMask = zeros(VertYNuDepth, HoriXNuDepth); |
---|
134 | OccFarDiffDepthMask(:,1:(end-1)) = OccFraDiffDepthHori; |
---|
135 | OccFarDiffDepthMask(:,2:(end)) = OccFarDiffDepthMask(:,2:end) | OccFraDiffDepthHori; |
---|
136 | OccFarDiffDepthMask(1:(end-1),:) = OccFarDiffDepthMask(1:(end-1),:) | OccFraDiffDepthVert; |
---|
137 | OccFarDiffDepthMask(2:(end),:) = OccFarDiffDepthMask(2:end,:) | OccFraDiffDepthVert; |
---|
138 | figure(1000); |
---|
139 | subplot(3,2,1); |
---|
140 | TempDepth = LaserDepth; |
---|
141 | TempDepth(logical(OccFarDiffDepthMask)) =-10; |
---|
142 | imagesc(TempDepth); |
---|
143 | title('LaserDepthMap'); |
---|
144 | figure(1000); |
---|
145 | subplot(3,2,2); |
---|
146 | ii = Img; |
---|
147 | ii(:,:,1) = 255*logical(edgeIm); |
---|
148 | image(ii); |
---|
149 | title('edgeDetected'); |
---|
150 | |
---|
151 | % show all the possible candidate pairs |
---|
152 | MedBoundaryPHori = conv2(MedSup,[1 -1],'same') ~=0; |
---|
153 | MedBoundaryPHori(:,end) = 0; |
---|
154 | MedBoundaryPVert = conv2(MedSup,[1; -1],'same') ~=0; |
---|
155 | MedBoundaryPVert(end,:) = 0; |
---|
156 | MedBoundaryP = MedBoundaryPVert |MedBoundaryPHori; |
---|
157 | ClosestNList = [ MedSup(find(MedBoundaryPHori==1)) MedSup(find(MedBoundaryPHori==1)+SegVertYSize);... |
---|
158 | MedSup(find(MedBoundaryPVert==1)) MedSup(find(MedBoundaryPVert==1)+1)]; |
---|
159 | ClosestNList = sort(ClosestNList,2); |
---|
160 | ClosestNList = unique(ClosestNList,'rows'); |
---|
161 | ClosestNList(ClosestNList(:,1) == 0,:) = []; |
---|
162 | NuPair = size(ClosestNList,1) |
---|
163 | %generate the boundary index mask |
---|
164 | BoundaryIndexMask = zeros(SegVertYSize, SegHoriXSize); |
---|
165 | HashList = ClosestNList(:,1)*MaxMedSup+ClosestNList(:,2); |
---|
166 | lH = find(MedBoundaryPHori); |
---|
167 | j = lH + SegVertYSize; |
---|
168 | HashBoundaryHori = sort([MedSup(lH) MedSup(j)],2); |
---|
169 | HashBoundaryHori = HashBoundaryHori(:,1)*MaxMedSup + HashBoundaryHori(:,2); |
---|
170 | lV = find(MedBoundaryPVert); |
---|
171 | j = lV + 1; |
---|
172 | HashBoundaryVert = sort([MedSup(lV) MedSup(j)],2); |
---|
173 | HashBoundaryVert = HashBoundaryVert(:,1)*MaxMedSup + HashBoundaryVert(:,2); |
---|
174 | for m = 1:size(HashList,1) |
---|
175 | Pointer = HashBoundaryHori == HashList(m); |
---|
176 | BoundaryIndexMask(lH(Pointer)) = m; |
---|
177 | Pointer = HashBoundaryVert == HashList(m); |
---|
178 | BoundaryIndexMask(lV(Pointer)) = m; |
---|
179 | end |
---|
180 | |
---|
181 | figure(200); imagesc(BoundaryIndexMask); |
---|
182 | |
---|
183 | if false |
---|
184 | figure(300); ii = Img; |
---|
185 | ii(:,:,1) = 255*MedBoundaryP; |
---|
186 | image(ii); |
---|
187 | hold on; |
---|
188 | scatter(NewRayPorjectImgMap(1,logical(OccFarDiffDepthMask)),NewRayPorjectImgMap(2,logical(OccFarDiffDepthMask)),100,LaserDepth(logical(OccFarDiffDepthMask))); |
---|
189 | hold off; |
---|
190 | end |
---|
191 | |
---|
192 | OccFarDiffDepthMask = imresize(OccFarDiffDepthMask, size(MedBoundaryP) ); |
---|
193 | |
---|
194 | Z_Mask = (MedBoundaryP .* imdilate(OccFarDiffDepthMask, SE5) ) | ( logical(edgeIm) .* imdilate(OccFarDiffDepthMask, SE5) ); |
---|
195 | temp_mask = (MedBoundaryP .* imdilate(OccFarDiffDepthMask, SE5) ); |
---|
196 | Mask_2nd = ( logical(edgeIm) .* imdilate(OccFarDiffDepthMask, SE5) ); |
---|
197 | |
---|
198 | %comlete the boundary |
---|
199 | ComPMask = Z_Mask; |
---|
200 | for l = 1:NuPair |
---|
201 | mask = BoundaryIndexMask == l; |
---|
202 | AllSize = sum(mask(:)); |
---|
203 | AndMask = Z_Mask & mask; |
---|
204 | AndSize = sum(AndMask(:)); |
---|
205 | PerCent = AndSize/AllSize; |
---|
206 | if PerCent > ThrePcik |
---|
207 | ComPMask(mask) = 1; |
---|
208 | elseif PerCent < ThreOut |
---|
209 | ComPMask(mask) = 0; |
---|
210 | end |
---|
211 | end |
---|
212 | |
---|
213 | % link CompMAsk |
---|
214 | [seglistNew ]=edgeSegDetection_new(ComPMask,k,1, 5, 3, 0.01, 3, 20); |
---|
215 | |
---|
216 | figure(1000); ii = Img; |
---|
217 | subplot(3,2,3); |
---|
218 | ii(:,:,1) = 255*MedBoundaryP; |
---|
219 | ii(:,:,3) = 255*OccFarDiffDepthMask; |
---|
220 | image(ii); |
---|
221 | title('Dilate_Occlu'); |
---|
222 | hold on; |
---|
223 | |
---|
224 | figure(700); ii = Img; |
---|
225 | ii(:,:,1) = 255*temp_mask; |
---|
226 | image(ii); |
---|
227 | hold on; |
---|
228 | figure(800); ii = Img; |
---|
229 | ii(:,:,1) = 255*Mask_2nd; |
---|
230 | image(ii); |
---|
231 | hold on; |
---|
232 | |
---|
233 | figure(600); ii = Img; |
---|
234 | ii(:,:,1) = 255*Z_Mask; |
---|
235 | image(ii); |
---|
236 | hold on; |
---|
237 | |
---|
238 | figure(1000); |
---|
239 | subplot(3,2,4); |
---|
240 | ii = Img; |
---|
241 | ii(:,:,1) = 255*ComPMask; |
---|
242 | image(ii); |
---|
243 | title('Complete_Occlu'); |
---|
244 | hold on; |
---|
245 | |
---|
246 | figure(1000); |
---|
247 | subplot(3,2,5); |
---|
248 | image(Img); |
---|
249 | drawseg(seglistNew,1000); |
---|
250 | title('LinkComplete'); |
---|
251 | |
---|
252 | saveas(1000,[ScratchDataFolder '/data/occlu/' filename{k} 'occlu_comp50.fig'],'fig'); |
---|
253 | %scatter(NewRayPorjectImgMap(1,logical(OccFarDiffDepthMask)),NewRayPorjectImgMap(2,logical(OccFarDiffDepthMask)),100,LaserDepth(logical(OccFarDiffDepthMask))); |
---|
254 | hold off; |
---|
255 | |
---|
256 | return; |
---|