ML_student
ML_student

Reputation: 41

OpenCV Python: How to warpPerspective a large image based on transform inferred from small region

I am using cv2.getPerspectiveTransform() and cv2.warpPerspective() to warp an image according to Adrian Rosenbrock blog : https://www.pyimagesearch.com/2014/08...

However in my case I have an image where I can only select the region B to be warped but need to warp (top-down view) the whole larger image A.

Can the parameters of the perspective transform inferred from the smaller region B be applied to the full image A? Is that possible?enter image description here

Upvotes: 2

Views: 15763

Answers (1)

fmw42
fmw42

Reputation: 53174

Here is one way to demonstrate that the matrix from the red square applies to the whole image in Python OpenCV.

Here I rectify the quadrilateral into a rectangle on the basis of its top and left dimensions.

Input:

enter image description here

import numpy as np
import cv2
import math

# read input
img = cv2.imread("red_quadrilateral.png")
hh, ww = img.shape[:2]

# specify input coordinates for corners of red quadrilateral in order TL, TR, BR, BL as x,
input = np.float32([[136,113], [206,130], [173,207], [132,196]])

# get top and left dimensions and set to output dimensions of red rectangle
width = round(math.hypot(input[0,0]-input[1,0], input[0,1]-input[1,1]))
height = round(math.hypot(input[0,0]-input[3,0], input[0,1]-input[3,1]))
print("width:",width, "height:",height)

# set upper left coordinates for output rectangle
x = input[0,0]
y = input[0,1]

# specify output coordinates for corners of red quadrilateral in order TL, TR, BR, BL as x,
output = np.float32([[x,y], [x+width-1,y], [x+width-1,y+height-1], [x,y+height-1]])

# compute perspective matrix
matrix = cv2.getPerspectiveTransform(input,output)
print(matrix)

# do perspective transformation setting area outside input to black
# Note that output size is the same as the input image size
imgOutput = cv2.warpPerspective(img, matrix, (ww,hh), cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=(0,0,0))

# save the warped output
cv2.imwrite("red_quadrilateral_warped.jpg", imgOutput)

# show the result
cv2.imshow("result", imgOutput)
cv2.waitKey(0)
cv2.destroyAllWindows()

enter image description here

Upvotes: 6

Related Questions