如果您可以使用内置插件(或自己编写),这就是我一直认为的部分解决方案。
首先,反转图像,使人为白色,背景为黑色。求所有行的总和。
data = sum(im);
这将为您提供一些嘈杂的数据,显示每行中的像素数。如果你绘制它,山峰是人,山谷是他们之间的区域。但是会有很多假峰。要解决此问题,请使用卷积,例如:
data2 = conv(data,ones(1,50)/50,'same');
50 的大小似乎工作得很好。它可能因图像而异,但如果它们或多或少都像上面的那样,50 应该可以工作。
现在您应该有一组干净的数据显示人们所在的高峰(特别是人们的最高点)。您可以执行单个 for 循环来查找这些峰值。但是,在您越过山谷之前,不要开始寻找下一个高峰。如果它有帮助,您可以使用导数找到导数通过零的位置(这些是峰值和谷值)。
deriv = (data2(2:end)-data(1:end-1));
但是我发现导数上并不总是有字面上的零点,因此您将不得不寻找符号变化。
您还可以下载公共功能以自动查找峰值。
因此,假设您将峰值存储在一些矢量峰值中。现在您知道了人的 x 位置,因此隔离列并找到第一个非零值(人的头顶和 y 位置),然后从总列大小中减去它以找到高度。所以对于第一个峰值:
x = peaks[1];
y = find(im(:,x),1,'first');
height = size(im,1)-y;
我认为这些方面的东西可能对你有用。你仍然需要做一些迭代,但不是很多。