用于图像旋转的Python角度计算

时间:2014-12-27 23:00:32

标签: python opencv geometry atan2 radians

我正在开发一个应用程序,首先需要稍微旋转图像以便对其进行校正。

我在两个点​​(x1,y1)和(x2,y2)之间检测到了一条垂直线。垂直线不是完全垂直的 - 第二个x坐标略小于或稍微大于顶部x,因此该线具有斜率。

我正在尝试计算线条斜率的角度,以便我可以旋转图像,然后重新检测线条,使其完全垂直。我在Python中使用OpenCV。

不幸的是,我在计算线的斜率时遇到问题,因此图像的旋转是不准确的。

我检测图像中垂直线斜率的功能如下:

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度等,当它们应该单向几度时。

如果有人可以帮我找到这个问题的解决方案,以便我能正确纠正图像的偏斜,那将非常感激。

1 个答案:

答案 0 :(得分:1)

我相信你找到了与你想要的角度相辅相成的角度。

几乎垂直的线相对于y轴具有非常小的角度,但是相对于x轴具有接近90度的角度。

将您的线段视为直角三角形的斜边。它相对于x轴形成的角度是atan((y2-y1)/(x2-x1))。相对于y轴的角度,我认为你要旋转的角度应该是atan((x2-x1)/(y2-y1))