本人偏爱matlab,因此将tld代码中的计算块之间的重叠率bb_overlap.cpp 用matlab的形式写了一下,不过作者的cpp文件中很全面,包含3种情况,这里只是第二种情况
说明一下,bb1和bb2这两个框的形式都是[x y w h]'
其中bb1有n1列,代表有n1个框
bb2有n2列,代表有n2个框
function out = bb_overlap_m(bb1,bb2)
bb1=bb1';
[~,n1]=size(bb1);
[~,n2]=size(bb2);
out=zeros(n1,n2);
area1=zeros(1,n1);
area2=zeros(1,n2);
%%
for i=1:n1
area1(1,i)=bb1(3,i)*bb1(4,i);
end
for i=1:n2
area2(1,i)=bb2(3,i)*bb2(4,i);
end
%%
bb1(3,:)=bb1(3,:)+bb1(1,:)-1;
bb1(4,:)=bb1(4,:)+bb1(2,:)-1;
bb2(3,:)=bb2(3,:)+bb2(1,:)-1;
bb2(4,:)=bb2(4,:)+bb2(2,:)-1;
%%
for i=1:n1
for j=1:n2
if bb1(1,i)>bb2(3,j)|| bb1(2,i)>bb2(4,j) || bb1(3,i)<bb2(1,j)|| bb1(4,i)<bb2(2,j)
out(i,j)=0;
continue;
end
colInt=min(bb1(3,i),bb2(3,j))-max(bb1(1,i),bb2(1,j))+1;
rowInt=min(bb1(4,i),bb2(4,j))-max(bb1(2,i),bb2(2,j))+1;
insec=colInt*rowInt;
out(i,j)=insec/(area1(1,i)+area2(1,j)-insec);
end
end
end