Итак, учитывая входной угол theta и группу координат points, вы хотите, чтобы минимальный охватывающий прямоугольник находился под этим углом (что это значит? -- ось высоты установлена под этим углом? ось ширины? и угол от вертикали по часовой стрелке (как заголовки) или по горизонтали против часовой стрелки (как математика)?). Более того, мы настраиваем высоту так, чтобы она была >= ширины.
В этом случае я думаю, что следующее может сработать:
- Преобразуйте координаты в новую систему координат, которая представляет собой просто ось x-y, повернутую на угол
theta (используйте для этого матрицу вращения)
- Найдите минимальный охватывающий прямоугольник в этой системе координат: теперь это просто поиск минимального охватывающего прямоугольника в горизонтально-вертикальных измерениях (поэтому нам больше не нужно беспокоиться о
theta, поскольку мы уже преобразовали координаты)
- Убедитесь, что минимальный объемлющий прямоугольник имеет высоту> = ширину
- Преобразуйте прямоугольник обратно в исходную систему координат (поверните его обратно на
theta).
- Используйте эти координаты для расчета среднего/стандартного отклонения.
Что-то вроде этого может работать (непроверено), настроить по вашему желанию:
% pts is 2xn
% theta is in degrees, anticlockwise from horizontal.
% returns 2xn matrix of indices into the min enclosing rectangle.
function minClosingRect = calcMinEnclosingRect( pts, theta )
% convert to radians and rotate by theta degrees ANTICLOCKWISE
thRad = theta*pi/180;
rotMat = [ cos(thRad) -sin(thRad); sin(thRad) cos(thRad) ];
ptsRot = rotMat * pts;
% find minimum enclosing rectangle of ptsRot
% in the horizontal-vertical direction
% this is just min/max coords.
minX = min(ptsRot(1,:));
maxX = min(ptsRot(1,:));
minY = min(ptsRot(2,:));
maxY = max(ptsRot(2,:));
% make sure height >= width
if (maxY-minY)<(maxX-minX)
% NOTE: depending on how you want you can extend
% - out the bottom
% - the top
% - centred (etc)
% e.g. to make the rectangle taller out the bottom
minY = maxY - (maxX-minX);
end
% construct indices into rectangle
[X Y] = meshgrid( minX:maxX, minY:maxY )
% convert indices back by rotating thRad degrees backwards.
rotMatInv = [ cos(-thRad) -sin(-thRad); sin(-thRad) cos(-thRad) ];
minClosingRect = rotMatInv * [X(:) Y(:)]';
Затем используйте его следующим образом (одна оговорка: X/Y против i/j):
minClosingRect = calcMinEnclosingRect( pts, theta );
mean2( Img(minClosingRect) )
std2( Img(minClosingRect) )
person
mathematical.coffee
schedule
30.12.2011