openCV 透视变换没有按预期工作

openCV perspective transformation doesn't work as expected

我有一张带文字的图片。 这是图像:

我想做的是使用透视变换拉直文本。

角落里的红点是检测到的边界。

这或多或少是我的代码(硬编码,为简单起见):

old_pts=np.float32([[2,41],[37,965],[1389,1121],[1389,0]])
bor=cv2.boundingRect(old_pts) #bounding_rect
ul=[bor[0],      bor[1]]       #upper left
ur=[bor[0],      bor[1]+bor[3]] #upper right
br=[bor[0]+bor[2],bor[1]+bor[3]] #bottom right
bl=[bor[0]+bor[2],bor[1]]       #bottom left

new_pts=np.float32([ul,ur,br,bl]) #new pts=[[2,0],[2,1122],[1390,1122],[1390,0]]

M = cv2.getPerspectiveTransform(old_pts,new_pts)
transformed_img = cv2.warpPerspective(new_img,M,(bor[3],bor[2])) #bor[3] and bor[4] are the bounding rect height&width. 

transforemed_img=transformed_img.astype(int)
cv2.imwrite('transformed.png',transformed_img)

现在,我得到的结果是:

为什么我没有得到一个漂亮的拉直矩形?

任何帮助将不胜感激!

看看你的积分:

你有:

old_pts=np.float32([[2,41],[37,965],[1389,1121],[1389,0]])

和:

new_pts=np.float32([ul,ur,br,bl]) #new pts=[[2,0],[2,1122],[1390,1122],[1390,0]]

但是,OpenCV 将 POINTS 管理为 (x,y) 值,而您的值在 (y,x) 中...我知道这很令人困惑,因为矩阵操作是使用 (y,x) 符号完成的。 . 问题是 OpenCV 将矩阵操作视为像矩阵一样的行和列,但点被视为笛卡尔坐标...

总而言之,尝试翻转点的轴并检查结果。