Расчет угла Python для поворота изображения

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

Я обнаружил вертикальную линию вниз по изображению между двумя точками (x1, y1) и (x2, y2). Вертикальная линия не полностью вертикальна - вторая координата x чуть меньше или чуть больше верхней x и поэтому линия имеет наклон.

Я пытаюсь рассчитать угол наклона линии, чтобы повернуть изображение, а затем повторно определить линию, чтобы она была идеально вертикальной. Для этого я использую OpenCV в Python.

К сожалению, у меня возникают проблемы с вычислением наклона линии, поэтому вращение изображения неточное.

Моя функция для определения наклона вертикальной линии на изображении выглядит следующим образом:

def find_vert_angles(vertical_line_candidates, vertical_line_candidates2, roi_x_coordinates,      roi_x_coordinates2):
line_angles_radians = []

for line_x, line_x2 in itertools.izip(vertical_line_candidates, vertical_line_candidates2):
    x_diff = line_x2 - line_x
    y_diff =  roi_x_coordinates[1][1] - roi_x_coordinates[0][1]

    if x_diff != 0:
        slope = y_diff / x_diff
        angle_in_radians = atan(slope)
        line_angles_radians.append(angle_in_radians)
    else:
        line_angles_radians.append(0)

return line_angles_radians

Мой код для поворота изображения, чтобы линия была вертикальной, выглядит следующим образом:

skew_angle = degrees(vert_angle[1])
print "Detected skew angle is " + str(skew_angle) + " degrees"
warp = cv2.getRotationMatrix2D((img_width/2,img_height/2),skew_angle,1)
image = cv2.warpAffine(image,warp,(img_width,img_height))

Но углы поворота получаются равными 249 градусам, 89 градусам и т. д., хотя они должны составлять всего несколько градусов в каждую сторону.

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


person user1022788    schedule 27.12.2014    source источник


Ответы (1)


Я считаю, что вы находите угол, который дополняет тот, который вы хотите.

Почти вертикальная линия будет иметь очень маленький угол по отношению к оси у, но почти 90-градусный угол по отношению к оси х.

Считайте, что ваш отрезок является гипотенузой прямоугольного треугольника. Угол, который он образует по отношению к оси x, равен atan((y2-y1)/(x2-x1)). Угол по отношению к оси Y, который, как мне кажется, вы хотите повернуть, должен быть atan((x2-x1)/(y2-y1))

person user1245262    schedule 27.12.2014