1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- function [top, pick] = nonMaxSupp(boxes,overlap,numpart)
- % Non-maximum suppression.
- % Greedily select high-scoring detections and skip detections
- % that are significantly covered by a previously selected detection.
- pick=[];
- if nargin < 2
- overlap = 0.5;
- end
- if nargin < 3
- numpart = floor(size(boxes,2)/4);
- end
- if isempty(boxes)
- top = [];
- else
- x1 = zeros(size(boxes,1),numpart);
- y1 = zeros(size(boxes,1),numpart);
- x2 = zeros(size(boxes,1),numpart);
- y2 = zeros(size(boxes,1),numpart);
- area = zeros(size(boxes,1),numpart);
- for p = 1:numpart
- x1(:,p) = boxes(:,1+(p-1)*4);
- y1(:,p) = boxes(:,2+(p-1)*4);
- x2(:,p) = boxes(:,3+(p-1)*4);
- y2(:,p) = boxes(:,4+(p-1)*4);
- area(:,p) = (x2(:,p)-x1(:,p)+1) .* (y2(:,p)-y1(:,p)+1);
- end
-
- s = boxes(:,5);
- [vals, I] = sort(s);
- pick = [];
- while ~isempty(I)
-
- last = length(I);
- i = I(last);
- %similar=find(abs(s(I)-s(i))<1e-5);
- %[m,i]=max(area(I(similar)));
- %i=I(similar(i));
- %disp('here');
-
- %pause;
- pick = [pick; i];
- xx1 = bsxfun(@max,x1(i,:), x1(I,:));
- yy1 = bsxfun(@max,y1(i,:), y1(I,:));
- xx2 = bsxfun(@min,x2(i,:), x2(I,:));
- yy2 = bsxfun(@min,y2(i,:), y2(I,:));
-
- w = xx2-xx1+1;
- w(w<0) = 0;
- h = yy2-yy1+1;
- h(h<0) = 0;
- inter = sum(w.*h,2);
- o = double(inter) ./double(sum(area(I,:),2));
- I(o > overlap) = [];
-
- end
- top = boxes(pick,:);
- end
|