动态目标框定
说明
在前文的运动目标分割基础上,此文将运动目标标定出来。主要是实现对人和车的认定。
实验思路
想要得到人,所以不需要在乎内部细节,而是要得到人的轮廓。那么,首先需要把人与车的轮廓尽可能呈现出来且各自连为一体,中间尽量没有孔洞。其次,找出人与车的区别。最后,根据两者区别框定人。
具体操作
获取轮廓得到带框定图像,先通过中值滤波消去部分噪点,再通过膨胀实现区域连通;
调用regionprops函数得到连通域边界的属性;
根据所得属性寻找人与车连通域的区别,发现主要在于人所占面积范围为1500-3500px,且其最小矩形长大于宽;
用以上区别来限制框定范围。
核心代码
for nn=41:500
filename = sprintf('待框定/dkd%04d.jpg',nn);
I = imread(filename);
BW = im2bw(I, graythresh(I));
[L,num]=bwlabel(BW,8);
STATS = regionprops(BW,'basic'); %获取轮廓信息,Area、Centroid、BoundingBox
[B,L] = bwboundaries(BW,'noholes'); %寻找边缘
imshow(label2rgb(L, @jet, [.5 .5 .5]))
hold on
for k = 1:length(B)
boundary = B{k};
plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2) %框轮廓
for i=1:num %限定人的轮廓的条件
if((STATS(i).Area>1500)&&(STATS(i).Area<3500)&&STATS(i).BoundingBox(4)>STATS(i).BoundingBox(3))
%矩形框定人
rectangle('Position',STATS(i).BoundingBox,'Curvature',[0,0],'LineWidth',2,'EdgeColor','r');
%text命令
text(STATS(i).Centroid(1),STATS(i).Centroid(2),'people','Color','black');
end
end
%保存
saveas(1,['kd',sprintf('%04d',nn),'.jpg']);
end
end