Subversion Repositories seema-scanner

Rev

Rev 236 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 236 Rev 245
Line 147... Line 147...
147
    unsigned int w = I.cols;
147
    unsigned int w = I.cols;
148
    unsigned int h = I.rows;
148
    unsigned int h = I.rows;
149
    I = I.reshape(1, h*w);
149
    I = I.reshape(1, h*w);
150
    I.convertTo(I, CV_32F);
150
    I.convertTo(I, CV_32F);
151
 
151
 
152
    QTime time;
152
    //QTime time;
153
    time.start();
153
    //time.start();
154
 
154
 
155
    cv::Mat fI;
155
    cv::Mat fI;
156
    cv::dft(I, fI, cv::DFT_ROWS + cv::DFT_COMPLEX_OUTPUT);
156
    cv::dft(I, fI, cv::DFT_ROWS + cv::DFT_COMPLEX_OUTPUT);
157
 
157
 
158
    std::cout << "elapsed: " << time.restart() << std::endl;
158
    //std::cout << "elapsed: " << time.restart() << std::endl;
159
 
159
 
160
    fI = fI.reshape(N*2, h);
160
    fI = fI.reshape(N*2, h);
161
 
161
 
162
    std::vector<cv::Mat> fIcomp;
162
    std::vector<cv::Mat> fIcomp;
163
    cv::split(fI, fIcomp);
163
    cv::split(fI, fIcomp);
164
 
164
 
165
    return fIcomp;
165
    return fIcomp;
166
 
166
 
167
}
167
}
168
 
168
 
-
 
169
// Determine mask based on positive monotony of phase in each row
-
 
170
inline void phaseMonotonyMask(cv::Mat& up, cv::Mat& mask){
-
 
171
 
-
 
172
    int nRows = up.rows;
-
 
173
    int nCols = up.cols;
-
 
174
 
-
 
175
    mask.create(nRows, nCols, CV_8UC1);
-
 
176
    mask.setTo(0);
-
 
177
 
-
 
178
    for(int r=0; r<nRows; r++){
-
 
179
 
-
 
180
        cv::Mat upRow = up.row(r);
-
 
181
        std::vector<int> b;
-
 
182
        //std::vector<float> lit;
-
 
183
        cv::Mat litMask(1, upRow.cols, CV_8UC1);
-
 
184
        litMask.setTo(0);
-
 
185
 
-
 
186
        // step 1: find longest increasing subsequence, (c) http://www.algorithmist.com
-
 
187
        std::vector<int> p(upRow.cols);
-
 
188
        int u, v;
-
 
189
 
-
 
190
        b.push_back(0);
-
 
191
 
-
 
192
        for(int i = 1; i < upRow.cols; i++){
-
 
193
 
-
 
194
            // If next element a[i] is greater than last element of
-
 
195
            // current longest subsequence, just push it at back of "b" and continue
-
 
196
            if (upRow.at<float>(0, b.back()) < upRow.at<float>(0, i)){
-
 
197
                p[i] = b.back();
-
 
198
                b.push_back(i);
-
 
199
                continue;
-
 
200
            }
-
 
201
 
-
 
202
            // Binary search to find the smallest element referenced by b which is just bigger than upRow[i]
-
 
203
            for(u = 0, v = b.size()-1; u < v;){
-
 
204
                int c = (u + v) / 2;
-
 
205
                if(upRow.at<float>(0, b[c]) < upRow.at<float>(0, i))
-
 
206
                    u = c+1;
-
 
207
                else
-
 
208
                    v = c;
-
 
209
            }
-
 
210
 
-
 
211
            // Update b if new value is smaller then previously referenced value
-
 
212
            if (upRow.at<float>(0, i) < upRow.at<float>(0, b[u])){
-
 
213
                if (u > 0) p[i] = b[u-1];
-
 
214
                b[u] = i;
-
 
215
            }
-
 
216
        }
-
 
217
 
-
 
218
        //lit.resize(b.size());
-
 
219
        for (u = b.size(), v = b.back(); u--; v = p[v]){
-
 
220
            litMask.at<uchar>(0, v) = 255;
-
 
221
            //lit[u] = v;
-
 
222
        }
-
 
223
 
-
 
224
        litMask.copyTo(mask.row(r));
-
 
225
    }
-
 
226
 
-
 
227
 
-
 
228
    return;
-
 
229
 
-
 
230
}
-
 
231
 
169
#endif // ALGORITHMTOOLS_H
232
#endif // ALGORITHMTOOLS_H