рассчитать ограничивающий прямоугольник после поворота - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть изображение и соответствующая ограничивающая рамка из 4 точек, это выглядит следующим образом [685,601,832,743], я хочу выполнить несколько поворотов, например, 90, 180, 270 и т. Д.

Я не уверен, как получитьограничивающий прямоугольник изображения позволяет сказать, что после поворота изображения на 90. Я использую imagemagick для выполнения поворота, я искал любую функцию, которая выдаст мне ограничивающий прямоугольник после поворота изображения, но я не смог найти ни одногоЯ застрял на этом более 3 часов. Любые предложения на этом этапе были бы очень полезны. Заранее спасибо.

1 Ответ

0 голосов
/ 10 апреля 2019

Используя ImageMagick и некоторые сценарии оболочки bash, вот как его вычислить.

Используются базовые уравнения вращения точек.(См. https://en.wikipedia.org/wiki/Rotation_of_axes). Однако, поскольку вращение происходит вокруг центра, необходимо вычесть координаты центра входных данных из координат точек, выполнить вращение и затем добавить центр выходного изображения обратно.

Обратите внимание, что вращение ImageMagick происходит по часовой стрелке, в то время как обычные уравнения преобразования координат задаются для против часовой стрелки, поэтому я должен отрицать угол поворота.

Также обратите внимание, что Y положительно направлен вниз в координатах изображения и нормальное вращение координат имеетY вверх. Таким образом, в уравнениях между изображением и нормальной декартовой системой координат произошел обмен знаками.

Вот тестовое изображение, которое я создаю:

convert -size 300x300 xc:skyblue -size 100x100 xc:pink -geometry +50+50 -composite test.png


enter image description here

Очевидно (из команды ImageMagick) 4 угла:

pt1=50,50
pt2=149,50
pt3=149,149
pt4=59,149


Большие значения (149) на 1 меньшерозовые размеры плюс начальные координаты (100-1 + 50 = 149), поскольку индексирование начинается с 0 в ImageMagick. Смещения относительно 0.

Далее я поворачиваю изображение:

convert test.png -background black -rotate 20 test2.png


enter image description here

Итак, чтобы вычислить 4 точки на выходе, мне сначала нужно знатьнасколько большой будет выход для данного угла поворота.

angle=20
ww=300
hh=300
ang=-$angle
wwr=$(convert xc: -format "%[fx:($ww*cos(pi*abs($ang)/180)+$hh*sin(pi*abs($ang)/180))]" info:)
hhr=$(convert xc: -format "%[fx:($ww*sin(pi*abs($ang)/180)+$hh*cos(pi*abs($ang)/180))]" info:)
echo "$wwr x $hhr"
384.514 x 384.514

Rounding to whole numbers, it would be
wwr=385
hhr=385

Note for computing the new dimensions, I use the abs of the sin and cos and all positive signs


Далее я переформатирую 4 точки в массивы X и Y для последующей обработки.

pt1=50,50
pt2=149,50
pt3=149,149
pt4=59,149
list="$pt1 $pt2 $pt3 $pt4"
echo "$list"
i=0
for pt in $list; do
xArr[$i]=$(echo "$pt" | cut -d, -f1)
yArr[$i]=$(echo "$pt" | cut -d, -f2)
i=$((i+1))
done
echo "${xArr[*]}"
50 149 149 59
echo "${yArr[*]}"
50 50 149 149


Теперь я вычисляюповернутые 4 угловые координаты:

angle=20
xlast=299
ylast=299
wwr=385
hhr=385
for ((i=0; i<4; i++)); do
xr=$(convert xc: -format "%[fx:((${xArr[$i]}-300/2)*cos(pi*$ang/180)+(${yArr[$i]}-300/2)*sin(pi*$ang/180)) + $wwr/2]" info:)
yr=$(convert xc: -format "%[fx:((${yArr[$i]}-300/2)*cos(pi*$ang/180)-(${xArr[$i]}-300/2)*sin(pi*$ang/180)) + $hhr/2]" info:)
echo "$xr,$yr"
done
132.733,64.3287
225.762,98.1887
191.902,191.218
107.33,160.436


Вы можете измерить их на выходном изображении, чтобы убедиться, что они правильные.Вы можете округлить до целых чисел по желанию.

Если вы хотите прямоугольную ограничивающую рамку, то просто вычислите значения minx, miny, maxx, maxy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...