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 将矩阵操作视为像矩阵一样的行和列,但点被视为笛卡尔坐标...
总而言之,尝试翻转点的轴并检查结果。
我有一张带文字的图片。
这是图像:
我想做的是使用透视变换拉直文本。
角落里的红点是检测到的边界。
这或多或少是我的代码(硬编码,为简单起见):
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 将矩阵操作视为像矩阵一样的行和列,但点被视为笛卡尔坐标...
总而言之,尝试翻转点的轴并检查结果。