2014-12-27 3 views
0

Я работаю над приложением, которое сначала необходимо слегка повернуть изображение, чтобы его можно было скопировать.Расчет угла 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 градусов и т. Д., Когда они должны быть всего лишь на несколько градусов в каждом направлении.

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

ответ

0

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

Почти вертикальная линия будет иметь очень малый угол относительно оси y, но угол около 90 градусов относительно оси x.

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

Смежные вопросы