天天看點

tld中的bb_overlap

本人偏愛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
   
           

繼續閱讀