2

我正在开发一个应用程序,该应用程序首先需要稍微旋转图像以将其歪斜。

我在两点 (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 度等,而它们应该只有几度。

如果有人可以帮助我找到解决此问题的方法,以便我可以正确纠正图像的倾斜,那将不胜感激。

4

1 回答 1

2

我相信您会找到与您想要的角度互补的角度。

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

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

于 2014-12-27T23:42:13.853 回答