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

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

Added original make3d

File size: 7.9 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 [Matches CoeffM Inliers]=CorrolationMatch( defaultPara, Pair, ITarget, IField, PointPix, POriReprojM, FieldOccluPix, MinMaxScaleFactor, Target2NumberOfPatches)
40
41% Find corrolation match along the epipolar line
42% by calling FindTarget.m for each pair of search
43
44% initializing Parameters
45% MatchTHre = 0.3; % Magic number change later
46if nargin <9
47        %Target2NumberOfPatches = [ 2.5 5];
48        Target2NumberOfPatches = [ 1 1]; % used smaller target size to speed up
49end
50ScaleFactorStep = 0.1;
51TargetReduceRatio = 0.95;
52[Iy Ix] = size(ITarget);
53[IyField IxField] = size(IField);
54TargetSize = round([Iy/55*Target2NumberOfPatches(1) Ix/305*Target2NumberOfPatches(2)]);% prevous used 5 and 10
55NumTarget = size(PointPix,2);
56
57% Process the Target_tmp region
58Target_tmp_top = round( PointPix(2,:) - TargetSize(1) );
59Target_tmp_bottom = round( PointPix(2,:) + TargetSize(1) );
60Target_tmp_left = round( PointPix(1,:) - TargetSize(2) );
61Target_tmp_right = round( PointPix(1,:) + TargetSize(2) );
62
63% detect region exceed the boundary of images and shift the region accordingly
64%       Yet make sure the PointPix is as close to the center of the Target_tmp as possible
65% (Shift the Target_tmp vertically)
66Mask =  Target_tmp_top < 1;
67shift_vertical(Mask) = (1 - Target_tmp_top(Mask));
68Target_tmp_top(Mask) = Target_tmp_top(Mask) + shift_vertical(Mask);
69Target_tmp_bottom(Mask) = Target_tmp_bottom(Mask) + shift_vertical(Mask);
70Mask = Target_tmp_bottom > Iy;
71shift_vertical(Mask) = ( Iy - Target_tmp_bottom(Mask));
72Target_tmp_top(Mask) = Target_tmp_top(Mask) + shift_vertical(Mask);
73Target_tmp_bottom(Mask) = Target_tmp_bottom(Mask) + shift_vertical(Mask);
74% (Shift the Target_tmp horizontal)
75Mask = Target_tmp_left < 1;
76shift_horizontal(Mask) = (1 - Target_tmp_left(Mask));
77Target_tmp_left(Mask) = Target_tmp_left(Mask) + shift_horizontal(Mask);
78Target_tmp_right(Mask) = Target_tmp_right(Mask) + shift_horizontal(Mask);
79Mask = Target_tmp_right > Ix;
80shift_horizontal(Mask) = (Ix - Target_tmp_right(Mask));
81Target_tmp_left(Mask) = Target_tmp_left(Mask) + shift_horizontal(Mask);
82Target_tmp_right(Mask) = Target_tmp_right(Mask) + shift_horizontal(Mask);
83
84% Define the TopMargin, BottomMargin, LeftMargin, and RightMargin of Target_tmp
85PointPixTopMargin = PointPix(2,:) - Target_tmp_top; % All Margin are positive
86PointPixBottomMargin =  Target_tmp_bottom - PointPix(2,:);
87PointPixLeftMargin =  PointPix(1,:) - Target_tmp_left;
88PointPixRightMargin =  Target_tmp_right - PointPix(1,:);
89
90% initializing variables
91Matches = zeros(4,NumTarget);
92%CoeffM = zeros(1,NumTarget);
93CoeffM = zeros(2,NumTarget);
94
95% 0) determine all possible Scale and region
96ScaleFactors = MinMaxScaleFactor(1):ScaleFactorStep:MinMaxScaleFactor(2);
97       
98% 1) Field that fully contain target_tmp       
99[ Rc ConS RoughConS tempConS] = EndPoint2BoxConS(defaultPara, Ix, Iy, POriReprojM, FieldOccluPix, 1);
100Field_top = round( RoughConS(3,:) - PointPixTopMargin*MinMaxScaleFactor(2));
101Field_left = round( RoughConS(1,:) - PointPixLeftMargin*MinMaxScaleFactor(2));
102Field_bottom =  round( RoughConS(4,:)  + PointPixBottomMargin*MinMaxScaleFactor(2));
103Field_right = round( RoughConS(2,:) + PointPixRightMargin*MinMaxScaleFactor(2));
104
105tic
106for i= 1:NumTarget
107    if rem(i,100) == 0
108        disp([ num2str( floor(i/100)) 'Target Tested in ' num2str(NumTarget)])
109    end   
110        % Pick the Proper target_tmp
111        ITarget_tmp = ITarget( Target_tmp_top(i):Target_tmp_bottom(i), Target_tmp_left(i):Target_tmp_right(i) );
112
113        % Define the Point to pick inside the Target Patch
114        [ PickRowInTarget_tmp PickColInTarget_tmp] = PickAnchorPoint(ITarget_tmp);
115        PickPointTarget(:,i) = [ PickRowInTarget_tmp + Target_tmp_top(i) - 1; PickColInTarget_tmp+ Target_tmp_left(i) - 1];
116
117        % prepare to run FindTarget
118
119        % Stop finfing Matches if the IField is crop by the Field image region, since it might cause Target not totally inside the Field
120        if Field_top(i) < 1 || Field_left(i) < 1 || Field_bottom(i) > IyField || Field_right(i) > IxField
121        if defaultPara.Flag.FlagCorrRefinement
122            Field_top(i)  = min( max( Field_top(i), 1), IyField);
123            Field_bottom(i)  = min( max( Field_bottom(i), 1), IyField);
124            Field_left(i)  = min( max( Field_left(i), 1), IxField);
125            Field_right(i)  = min( max( Field_right(i), 1), IxField);
126        else   
127                continue;
128        end   
129        end
130
131        % Pick the Field_tmp
132        IField_tmp = IField(Field_top(i):Field_bottom(i), Field_left(i):Field_right(i));
133
134        % 2) Epipolar geometry
135        T1_hat = [[0 -Pair.T(3) Pair.T(2)];...
136            [Pair.T(3) 0 -Pair.T(1)];...
137            [-Pair.T(2) Pair.T(1) 0]];
138        F = inv(defaultPara.InrinsicK2)'*T1_hat*Pair.R*inv(defaultPara.InrinsicK1);
139        EpipoalLine = F*[ PointPix; ones(1,size(PointPix,2))];
140        NormalizedEpipoalLine = EpipoalLine./repmat( sqrt(sum( EpipoalLine(1:2,:).^2,1)),3,1);
141% if i == 10 || i ==34 || i ==45
142%    pause
143% end   
144        % Run Find Target
145        [ X, Y, Scale, Coeff, Coeffs ] = FindTarget( defaultPara, IField_tmp, ITarget_tmp, Field_top(i), Field_left(i), PickRowInTarget_tmp, PickColInTarget_tmp, NormalizedEpipoalLine(:,i), ...
146                [Iy Ix], ScaleFactors, 1, 1);% Min disable EpipolarLineFlag
147        X = X+Field_left(i);
148        Y = Y+Field_top(i);
149        CoeffM(:,i) = Coeff;
150        Matches(:,i) = [ PickPointTarget([2 1],i); X; Y];
151%      if i == 10 || i ==34 || i ==45
152%       target_tmp = imresize(ITarget_tmp,Scale,'bicubic');
153%       TargetPickPoint = [PickRowInTarget_tmp PickColInTarget_tmp]*Scale;
154%       Box= ImgOverLay(target_tmp, IField, [Y X], TargetPickPoint);
155%       figure(1); imshow(Box);
156%       hold on; scatter(X,Y,'r');hold off;
157%       figure(2); imshow(ITarget);
158%       hold on; scatter( PickPointTarget(2,i), PickPointTarget(1,i),'r');hold off;
159%     pause;
160%      end
161end
162
163% Clean the redundent matches so that each PointPix match a unique points in the Field image //Min add July 10th================
164[Inliers] = CleanMatch(Matches, CoeffM(1,:));
165[InliersReverse] = CleanMatch(Matches(:,Inliers), CoeffM(1,Inliers));
166Inliers = Inliers(InliersReverse);
167% ===============================================================================================================================
168
169TimeForCorrolationMatch = toc;
170if defaultPara.Flag.FlagRefinementDisp
171        disp([ 'End Of CorrolationMatch, it takes ' num2str(TimeForCorrolationMatch) ' seconds']);
172end
173
174return;
Note: See TracBrowser for help on using the repository browser.