Бумага содержит диаграмму выходного формата.Вместо указания поля обычным способом, оно задается как набор расстояний (вверх, вправо, вниз и влево) от смещения (x, y), в дополнение к углу A, поле суммы повернуто против часовой стрелки,
Обратите внимание, что scores
и geometry
проиндексированы y, x
, что противоречит любой логике ниже offset
.Поэтому для получения геометрических компонентов с наивысшей оценкой y, x
:
high_scores_yx = np.where(scores[0][0] >= np.max(scores[0][0]))
y, x = high_scores_yx[0][0], high_scores_yx[1][0]
h_upper, w_right, h_lower, w_left, A = geometry[0,:,y,x]
Код использует offset
для хранения смещения нижнего правого угла прямоугольника.Поскольку это нижний правый угол, ему нужны только w_right
и h_lower
, которые в коде равны x1_data
и x2_data
соответственно.
Положение нижнего правого угла относительно исходного смещения offsetX, offsetY
зависит от угла поворота.Ниже пунктирные линии показывают ориентацию осей.Компоненты для перехода от оригинала к нижнему смещению помечены фиолетовым (по горизонтали) и фиолетовым (по вертикали).Обратите внимание, что sin(A) * w_right
компонент вычитается , потому что y
становится больше с понижением в этой системе координат.
Это объясняет
offset = ([offsetX + cosA * x1_data[x] + sinA * x2_data[x], offsetY - sinA * x1_data[x] + cosA * x2_data[x]])
Далее: p1
и p3
- это нижний левый и верхний правый углы прямоугольника, соответственно, с учетом поворота.center
- это просто среднее значение этих двух точек.
Наконец, -1*angle * 180.0 / math.pi
преобразует исходный угол в радианах против часовой стрелки в угол в градусах по часовой стрелке (поэтому конечный выходной угол должен быть отрицательным для объектов, повернутых против часовой стрелки)).Это для совместимости с методом CV2 boxPoints
, используемым в:
https://github.com/opencv/opencv/blob/7fb70e170154d064ef12d8fec61c0ae70812ce3d/samples/dnn/text_detection.py