/
main.cpp
executable file
·185 lines (98 loc) · 4.31 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#include"cost.h"
#include"Param.h"
#include <fstream>
#include <iostream>
#include "MFA.h"
std::vector<std::string> name_pool;
double cov_pool[Disp_K][Disp_K];
char char_buffer[50];
#define weight_l 0.0005 //0.0004 // 2.0
#define trun_l weight_l*5 //0.002
void Exp_and_norm(double * msg, double * data, int width, int height);
void cal_constant_val(cv::Mat & I, int r, std::vector<cv::Mat> & Var_I);
void Guidedfilter_color(cv::Mat & I, cv::Mat & p, cv::Mat & q, int r, double eps,std::vector<cv::Mat> & Var_I);
void V_vol_regulation_linear(double * V, double *cost, int width, int height, int level, float weight, float trunc);
void V_vol_regulation_pottos(double * V, double *cost, int width, int height, int level, double p1, double p2);
void Sum_up_cost(double * V, double *cost, int width, int height, int level);
double * cost_cross(cv::Mat & imL, cv::Mat & imR, int L1,int L2 ,int color_diff , int win_max ,int datacost_min );
void stereo_level(double * cost, cv::Mat & im, int F_win_l, double eps, double param_1, double param_2, double * V,cv::Mat & out_im);
void cross_check(cv::Mat & imL, cv::Mat & imR,cv::Mat & Occ_map);
void fill_in_stick(cv::Mat & Disp_map,cv::Mat & Occ_map);
void stereo_pyra(double * dd_cost,cv::Mat & im, int F_win_l, double eps, double param_1, double param_2,int cur_l,double *& old_V,cv::Mat & out_im);
void WMF(cv::Mat & imL, cv::Mat & Disp_map, cv::Mat & Occ_map,double gamma_c,double gamma_d,double r_median);
void build_pyra(double * cost, cv::Mat & im, cv::Mat & new_im, double *& new_cost);
void save_data(const char * name,const char * data,int longth){
fstream file;
file.open(name ,ios_base::out|std::ios::binary|ios_base::in|ios_base::trunc );//¸½¼Ó£ºios_base::app
file.write(data ,longth);
file.close();
}
void compare_res(cv::Mat & res,cv::Mat & gro){
cv::Mat c_res(res.rows,res.cols,CV_8UC3,cv::Scalar::all(0));
for(int j=0;j<res.rows;j++){
for(int i=0;i<res.cols;i++){
c_res.data[3*(j*res.cols+i)] = res.data[j*res.cols+i];
c_res.data[3*(j*res.cols+i)+1] = res.data[j*res.cols+i];
c_res.data[3*(j*res.cols+i)+2] = res.data[j*res.cols+i];
}
}
for(int j=0;j<res.rows;j++){
for(int i=0;i<res.cols;i++){
if(gro.data[j*res.cols+i]==0)
continue;
if(abs(res.data[j*res.cols+i]-gro.data[j*res.cols+i])>scale_K){
c_res.data[3*(j*res.cols+i)] = 0;
c_res.data[3*(j*res.cols+i)+1] = 0;
c_res.data[3*(j*res.cols+i)+2] = 255;
}
}
}
cv::imwrite("/Users/xiaotan/Data/CTMAP/comp_res.png",c_res);
}
int main(){
name_pool.push_back("teddy");
for(int iii = 0;iii<name_pool.size();iii++){
std::string directory = "/Users/xiaotan/Data/CTMAP/";
std::string imL_name = directory+name_pool[iii]+"/imL.png";
std::string imR_name = directory+name_pool[iii]+"/imR.png";
cv::Mat imL=cv::imread(imL_name.c_str());
cv::Mat imR=cv::imread(imR_name.c_str());
cv::Mat imL_;
cv::Mat imR_;
cv::flip(imR,imL_,1);
cv::flip(imL,imR_,1);
int height = imL.rows;
int width = imL.cols;
double * cost = cal_cost(imL,imR,15.0/255,4.0/255,0.86,1); //15,4.0 0.86 1
///////////////////////////////////smooth before using for guiding////////////////////////////////
/*
cv::medianBlur(imL,imL,3);
cv::medianBlur(imR,imR,3);
cv::medianBlur(imL_,imL_,3);
cv::medianBlur(imR_,imR_,3);
*/
imL.convertTo(imL,CV_64FC3);
imR.convertTo(imR,CV_64FC3);
imL = imL.mul(cv::Mat(height,width,CV_64FC3,cv::Scalar::all(1.0/255)));
imR = imR.mul(cv::Mat(height,width,CV_64FC3,cv::Scalar::all(1.0/255)));
imL_.convertTo(imL_,CV_64FC3);
imR_.convertTo(imR_,CV_64FC3);
imL_ = imL_.mul(cv::Mat(height,width,CV_64FC3,cv::Scalar::all(1.0/255)));
imR_ = imR_.mul(cv::Mat(height,width,CV_64FC3,cv::Scalar::all(1.0/255)));
double delta_step = 1.5;
double delta_min = 0.00001;
double * old_V = NULL;
double * old_V_ = NULL;
cv::Mat disp_L;
cv::Mat disp_R;
stereo_pyra( cost,imL, F_win, Eps, 0.00002, 0.00002*5, 0,old_V,disp_L);
Exp_and_norm(old_V,cost,width,height);
cv::Mat out_im;
disp_out(imL,old_V,Disp_K,out_im);
cv::imwrite("/Users/xiaotan/Data/CTMAP/teddy/result.png",out_im);
free(old_V);
free(old_V_);
free(cost);
}
return 0;
}