-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain2.m
143 lines (116 loc) · 4.63 KB
/
main2.m
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
clear;
close all;
vid_read = VideoReader('./img/driverec3.mp4','CurrentTime',630);
%% 出力ビデオ形式の選択
% オフラインMATLABは下記(mp4形式)
vid_write = VideoWriter('./img/encode','MPEG-4');
% MATLAB Onlineは下記を有効にする(avi形式.mp4はエラーになるため)
%vid_write = VideoWriter('./img/encode','Motion JPEG AVI');
open(vid_write);
%vid_write.FrameRate = vid_read.FrameRate;
countr = 0;
N = 10; % フィルタ演算する1辺の長さ = N x N (pixel)
obj_thres = N^2/2;% 物体認識の下限閾値
check_image = true; % 数フレームおきに生成画像を目視確認するか?
while hasFrame(vid_read)
img = readFrame(vid_read);
%img = imrotate(img,-90); % image processing toolbox
img = imresize(img, [480 640]);
%%%%
%% HSV変換し、輝度情報(V)だけ使用する
ref_val = (rgb2hsv(img));
ref_val = double(ref_val(:,:,3));
% ref_val2 = ref_val;
% ref_scale = ref_val;
% imagesc((ref_scale))
% colorbar
%% OTSU' Method
ref_gray_bk = ref_val;
gthresh3 = my_graythresh(ref_val);
ref_val(ref_val > gthresh3) = 0;
gthresh2 = my_graythresh(ref_val);
ref_val = ref_gray_bk;
ref_val(ref_val > gthresh2) = 0;
gthresh = my_graythresh(ref_val);
% 検討パラメータその1
% ref_val(:) = 2.0;
% ref_val(ref_gray_bk < (1+gthresh3)/2) = 0.0;
% ref_val(ref_gray_bk < gthresh3) = 0.5;
% ref_val(ref_gray_bk < gthresh2) = 1.0;
% ref_val(ref_gray_bk < gthresh) = 0.0;
% % 検討パラメータその1おわり
% 検討パラメータその2
ref_val(:) = 2.0;
ref_val(ref_gray_bk < (1-gthresh2)) = 1.0;
ref_val(ref_gray_bk < (1-gthresh3)) = 0; %0.5;
ref_val(ref_gray_bk < gthresh3) = 0.5;
ref_val(ref_gray_bk < gthresh2) = 1.0;
ref_val(ref_gray_bk < gthresh) = 0.0;
% 検討パラメータその2おわり
% % 白線検出。わざと大きめの値にしている。
% % 路上でこの色が多く検出される場合、光量が足りてない。
% % ECUまたはドライバにヘッドライト点灯指示を通知。
% %ref_val(ref_gray_bk >= (1-gthresh3)) = 5.0;
% 大津の3値化の結果を確認する場合は下記3行をコメントアウト解除
% figure(1)
% imshow(ref_val ./ max(ref_val,[],"all"))
% title("Otsu's method (N-values)")
% tick = tic;
% sparse defocus blur
img = img(:,:,2); % RGBのうち、G(緑)成分のみ使う
ref_spa = (f_blur(img,4,2) - f_blur(img,16,2)).*2;
%ref_spa = ((img) - f_blur(img,16)).*2;
e = edge((img),'log'); % あとで手実装する
ref_spa(e == 0) = 0;
%% depth estimation
% 大津の手法によりセグメントした結果に疎(sparse)な深度推定を反映させ、
% 密(dense)な結果にする
% 言い換えると、大津の3値化により簡易的に物体検出をし、
% defocus blurによる結果で塗り絵をしているだけ
im_width = width(ref_spa);
im_height = height(ref_spa);
img_dense = zeros(size(ref_spa));
fill_enable = false;
edge_factor = 0;
for i=1:floor(N/2):im_width-N
for j=1:floor(N/2):im_height-N
pick_defocus = ref_spa(j:j+N-1,i:i+N-1);
pick_matrices = ref_val(j:j+N-1,i:i+N-1);
ker_max = max(pick_defocus, [], 'all');
mat_sum = sum(pick_matrices, 'all');
if (ker_max > 0) % エッジがある
if (fill_enable)
if edge_factor < ker_max
edge_factor = ker_max; % 近傍のエッジで最大のものを採用
end
else
edge_factor = ker_max;
fill_enable = true; % 塗りつぶしフラグをtrue
end
end
if fill_enable
img_dense(j:j+N-1,i:i+N-1) = double(edge_factor) * pick_matrices ;
end
if mat_sum <= obj_thres % 近傍に物体がない
fill_enable = false; % 塗りつぶしフラグをfalse
edge_factor = 0;
end
end
end
%toc(tick)
%i=30; % todo: fix this. this is bias(background noise).
%img_dense(img_dense < i) = 0; % remove background noise
im = ind2rgb(uint8(img_dense),turbo(190));
if check_image
countr = countr + 1;
if countr > 60
countr = 0;
figure(2)
imshow(im)
drawnow
end
end
writeVideo(vid_write,im);
end
% 書き込みしたビデオファイルをクローズ
close(vid_write);