问题描述
我正在尝试旋转图像的透视图,以便获得可以提供正视图透视图的结果。我正在使用cv2.WarpPerspective函数。但是,执行扭曲时,图像的某些部分会被剪切掉。如何避免这种情况?我认为的一个选择是找到图像特定部分的转换矩阵,然后将该矩阵应用于整个图像。但是,该方法未取得令人满意的结果。
我正在使用的代码是:
import numpy as np
import cv2
from google.colab.patches import cv2_imshow
img = cv2.imread("drive/My Drive/Images_for_Adarsh/DSC_0690.JPG")
height,width = 1000,1500
img = cv2.resize(img,(width,height))
pts1 = np.float32([[ 250,0],[1220,300],[1300,770],[ 250,860]])
pts2 = np.float32([[0,[width,height],[0,height]])
matrix = cv2.getPerspectiveTransform(pts1,pts2)
print(matrix.shape)
print(matrix)
imgOutput = cv2.warpPerspective(img,matrix,height))
cv2_imshow(imgOutput)
cv2.imwrite("drive/My Drive/PerspectiveWarp-Results1/0690_coarse/0690([[ 250,860]]).JPG",imgOutput)
输入图像:
变形的图像:
解决方法
这是在Python / OpenCV中扭曲图像并添加额外空间的一种简单方法,该空间将包含更多输入,但输入外部的区域将保持透明。
输入:
import numpy as np
import cv2
# read input
img = cv2.imread("building.jpg")
# resize
height,width = 1000,1500
img = cv2.resize(img,(width,height))
# specify conjugate coordinates and shift output on left and top by 500
pts1 = np.float32([[ 250,0],[1220,300],[1300,770],[ 250,860]])
pts2 = np.float32([[+500,+500],[width+500,height+500],[+500,height+500]])
# compute perspective matrix
matrix = cv2.getPerspectiveTransform(pts1,pts2)
print(matrix.shape)
print(matrix)
# convert image to BGRA with opaque alpha
img = cv2.cvtColor(img,cv2.COLOR_BGR2BGRA)
# do perspective transformation setting area outside input to transparent
# extend output size so extended by 500 all around
imgOutput = cv2.warpPerspective(img,matrix,(width+1000,height+1000),cv2.INTER_LINEAR,borderMode=cv2.BORDER_CONSTANT,borderValue=(0,0))
# resize output,since it is too large to post
imgOutput = cv2.resize(imgOutput,height))
# save the warped output
cv2.imwrite("building_warped.png",imgOutput)
# show the result
cv2.imshow("result",imgOutput)
cv2.waitKey(0)
cv2.destroyAllWindows()
注意:应该可以使用矩阵将输入角投影到输出域,并计算所需的输出大小以容纳所有扭曲的输入。