[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 [ P, X, Outliner] = ProjectionFactorization_missing_data... |
---|
| 40 | ( ARes, BRes, x_im, inc, depth) |
---|
| 41 | % This funciton given the match in image coordinate and the initial depth |
---|
| 42 | % and estimate the Camera matrix and the 3d position of the match points |
---|
| 43 | |
---|
| 44 | % setup parameters |
---|
| 45 | Min_prjective_depth_change_ratio = 1e-6; |
---|
| 46 | ProjErrorRatio = 0.0005; |
---|
| 47 | No_Camera = size(depth,3); |
---|
| 48 | No_Points = size(x_im,2) |
---|
| 49 | MaxCount = 100; |
---|
| 50 | TotalOutlinerPercentage = 50; |
---|
| 51 | IterOutlinerPercentage = TotalOutlinerPercentage/MaxCount; |
---|
| 52 | |
---|
| 53 | % building matrix |
---|
| 54 | lamda = []; |
---|
| 55 | Xim = []; |
---|
| 56 | INC = []; |
---|
| 57 | for i = 1:No_Camera |
---|
| 58 | lamda = [ lamda; repmat(depth(:,:,i), 3, 1)]; |
---|
| 59 | Xim_miss = [ Xim; [x_im(:,:,i); ones( 1, No_Points )]]; |
---|
| 60 | INC = [INC; repmat(inc(:,:,i),3,1)]; |
---|
| 61 | end |
---|
| 62 | |
---|
| 63 | count = 1 |
---|
| 64 | Outliner = []; |
---|
| 65 | while count < MaxCount |
---|
| 66 | |
---|
| 67 | % normalized the depth and Xim |
---|
| 68 | RowNormalizeFactor = sum(lamda,2); |
---|
| 69 | RowNormalizeCount = sum(lamda ~=0, 2); |
---|
| 70 | RowNormalizeFactor = RowNormalizeFactor./RowNormalizeCount; |
---|
| 71 | RowNormalizeFactor = sqrt(1./RowNormalizeFactor); |
---|
| 72 | %lamdaNormal = lamda.*repmat( RowNormalizeFactor, 1, No_Points); |
---|
| 73 | ColumnNormalizeFactor = sum(lamda,1); |
---|
| 74 | ColNormalizeCount = sum(lamda ~=0, 1); |
---|
| 75 | ColNormalizeFactor = ColNormalizeFactor./ColNormalizeCount; |
---|
| 76 | ColNormalizeFactor = sqrt(1./ColNormalizeFactor); |
---|
| 77 | %lamdaNormal = lamdaNormal.*repmat( ColumnNormalizeFactor,No_Camera*3,1); |
---|
| 78 | lamdaNormal = RowNormalizeFactor*ColNormalizeFactor; |
---|
| 79 | |
---|
| 80 | % First Complete missing data |
---|
| 81 | [e,Xim,s] = rankrsfm(lamdaNormal.*Xim_miss,INC); |
---|
| 82 | |
---|
| 83 | % use estimated depth for missing data |
---|
| 84 | for i = 1:No_Camera |
---|
| 85 | lamda((3*i-2):(3*i),find(~inc(:,:,i))) = ... |
---|
| 86 | repmat( Xim(3*i,find(~inc(:,:,i)))./lamdaNormal(3*i,find(~inc(:,:,i))), 3, 1); |
---|
| 87 | end |
---|
| 88 | |
---|
| 89 | % normalized the depth and Xim again with new lamda |
---|
| 90 | RowNormalizeFactor = 1./( sqrt( sum(lamda.^2,2))); |
---|
| 91 | lamdaNormal = lamda.*repmat( RowNormalizeFactor, 1, No_Points); |
---|
| 92 | ColumnNormalizeFactor = sqrt(3)./( sqrt( sum(lamdaNormal.^2,1))); |
---|
| 93 | lamdaNormal = lamdaNormal.*repmat( ColumnNormalizeFactor,No_Camera*3,1); |
---|
| 94 | |
---|
| 95 | % Solving SVD |
---|
| 96 | [ U S V] = svds(lamdaNormal.*Xim,4); |
---|
| 97 | P = U*S; |
---|
| 98 | X = V'; |
---|
| 99 | |
---|
| 100 | % new lamda |
---|
| 101 | M = P*X; |
---|
| 102 | % M = M./repmat( RowNormalizeFactor, 1, No_Points); |
---|
| 103 | % M = M./repmat( ColumnNormalizeFactor,No_Camera*3,1); |
---|
| 104 | M = M./lamdaNormal; |
---|
| 105 | ThirdSample = (1:No_Camera)*3; |
---|
| 106 | TempLamda = M( ThirdSample, :); |
---|
| 107 | |
---|
| 108 | % calculate the geometric differency of measured and estimated projection points on the image plane |
---|
| 109 | NewLamda = TempLamda( reshape( repmat( 1:No_Camera, 3, 1), [], 1),:); |
---|
| 110 | x_im_est = M./NewLamda; |
---|
| 111 | xIm = Xim( reshape( [ ThirdSample-2; ThirdSample-1], [], 1), :); |
---|
| 112 | xImEst = x_im_est( reshape( [ ThirdSample-2; ThirdSample-1], [], 1), :); |
---|
| 113 | DiffProj = xIm - xImEst; |
---|
| 114 | EclideanError = norms( reshape(DiffProj, 2, [])); |
---|
| 115 | InlinerUpperBound = prctile( EclideanError, 100 - IterOutlinerPercentage); |
---|
| 116 | OutlinerPtr = EclideanError > InlinerUpperBound; |
---|
| 117 | OutlinerPtr = reshape( OutlinerPtr, 2, []); |
---|
| 118 | OutlinerPtr = sum( OutlinerPtr,1); |
---|
| 119 | figure(15); |
---|
| 120 | hist( EclideanError,100); |
---|
| 121 | AAvgDiffProj(count) = mean(norms(DiffProj(1:2,:))); |
---|
| 122 | BAvgDiffProj(count) = mean(norms(DiffProj(3:4,:))); |
---|
| 123 | if AAvgDiffProj(count) < norm( ARes*ProjErrorRatio) && BAvgDiffProj(count) < norm( BRes*ProjErrorRatio) |
---|
| 124 | break; |
---|
| 125 | end |
---|
| 126 | |
---|
| 127 | % Check stop |
---|
| 128 | Ratio(count) = max( max( abs((NewLamda( ThirdSample, :) - lamda( ThirdSample, :))./lamda( ThirdSample, :)))); |
---|
| 129 | if Ratio(count) < Min_prjective_depth_change_ratio |
---|
| 130 | break; |
---|
| 131 | end |
---|
| 132 | count = count +1; |
---|
| 133 | lamda = NewLamda; |
---|
| 134 | |
---|
| 135 | % =============remove Outliner ============= |
---|
| 136 | Outliner = [ Outliner find(OutlinerPtr~=0)]; |
---|
| 137 | lamda(:, OutlinerPtr~=0) = []; |
---|
| 138 | Xim(:, OutlinerPtr~=0) = []; |
---|
| 139 | No_Points = size( Xim,2); |
---|
| 140 | % ========================================== |
---|
| 141 | end |
---|
| 142 | No_Points |
---|
| 143 | count |
---|
| 144 | AAvgDiffProj(count-1) |
---|
| 145 | BAvgDiffProj(count-1) |
---|
| 146 | figure(100); hist( DiffProj(:), 1000); |
---|
| 147 | figure(10); scatter(xImEst(1,:),xImEst(2,:),4,ones(1,size(xImEst,2))); |
---|
| 148 | hold on; scatter(xIm(1,:),xIm(2,:),4,0.5*ones(1,size(xIm,2)));hold off; |
---|
| 149 | figure(11); scatter(xImEst(3,:),xImEst(4,:),4,ones(1,size(xImEst,2))); |
---|
| 150 | hold on; scatter(xIm(3,:),xIm(4,:),4,0.5*ones(1,size(xIm,2)));hold off; |
---|
| 151 | |
---|
| 152 | % restorge P X |
---|
| 153 | P = P./repmat( RowNormalizeFactor, 1, 4); |
---|
| 154 | X = X./repmat( ColumnNormalizeFactor, 4, 1); |
---|
| 155 | % X = X./repmat(X(4,:), 4,1); |
---|
| 156 | |
---|
| 157 | return; |
---|