[37] | 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; |
---|