下面以并列出matlab和c++版本的代码及实验结果。
MATLAB版本:
有个地方36~42行应该还能优化,只是我没找到相应的函数,这个地方运行很慢
1
%function SADMatch
2
clear,clc
3
tic
4
%im1=imread('Test_left.jpg');
5
%im2=imread('Test_right.jpg');
6
% im1=imread('im0.jpg');
7
% im2=imread('im1.jpg');
8
im1=imread('left.BMP');
9
im2=imread('right.BMP');
10
11
12
if isrgb(im1)
13
im1=rgb2gray(im1);
14
end
15
%imshow(im1);
16
im1=double(im1);
17
18
if isrgb(im2)
19
im2=rgb2gray(im2);
20
end
21
%figure
22
%imshow(im2);
23
im2=double(im2);
24
25
D=20; %最大视差
26
N=5; %窗口大小的一半
27
[H,W]=size(im1);
28
29
%计算右图减去左图,相减产生D个矩阵放到imgDiff中
30
imgDiff=zeros(H,W,D);
31
e=zeros(H,W);
32
for i=1:D
33
fprintf('%g\n',i)
34
e(:,1:(W-i))=abs(im2(:,1:(W-i))- im1(:,(i+1):W));
35
%e=conv2(e,e,'same');
36
e2=zeros(H,W);%计算窗口内的和
37
for y=(N+1):(H-N)
38
for x=(N+1):(W-N)
39
e2(y,x)=sum(sum(e((y-N):(y+N),(x-N):(x+N))));
40
end
41
end
42
imgDiff(:,:,i)=e2;
43
end
44
45
%找到最小的视差,到dispMap
46
dispMap=zeros(H,W);
47
for x=1:W
48
for y=1:H
49
%[val,id]=min(imgDiff(y,x,:));
50
[val,id]=sort(imgDiff(y,x,:));
51
if abs(val(1)-val(2))>10
52
dispMap(y,x)=id(1);
53
end
54
end
55
end
56
dispMap=dispMap*200/D;
57
dispMap=uint8(dispMap);
58
toc
59
imshow(dispMap)
60
%imwrite(dispMap,'dispMap.jpg')
c版本: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
加入了crosscheck功能
1
}