Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenCV warpperspective

Tags:

For some reason whenever I use OpenCV's warpPerspective() function, the final warped image does not contain everything in the original image. The left part of the image seems to get cut off. I think the reason why this is happening is because the warped image is created at the leftmost position of the canvas for the warpPerspective(). Is there some way to fix this? Thanks

like image 310
Hien Avatar asked May 22 '11 10:05

Hien


People also ask

What is warpPerspective OpenCV?

OpenCV program in python to demonstrate warpPerspective() function to read the given image and align the given image and then fit the size of the aligned image to the size of the original image using warpPerspective() function: #importing the module cv2 and numpy. import cv2. import numpy as np.

How do I stretch an image in OpenCV?

To stretch the image in Python, use the cv2. resize() method and pass the explicit dimensions on scaling the images.


1 Answers

The problem occurs because the homography maps part of the image to negative x,y values which are outside the image area so cannot be plotted. what we wish to do is to offset the warped output by some number of pixels to 'shunt' the entire warped image into positive coordinates(and hence inside the image area).

Homographies can be combined using matrix multiplication (which is why they are so powerful). If A and B are homographies, then AB represents the homography which applies B first, and then A.

Because of this all we need to do to offset the output is create the homography matrix for a translation by some offset, and then pre-multiply that by our original homography matrix

A 2D homography matrix looks like this :

[R11,R12,T1] [R21,R22,T2] [ P , P , 1] 

where R represents a rotation matrix, T represents a translation, and P represents a perspective warp. And so a purely translational homography looks like this:

[ 1 , 0 , x_offset] [ 0 , 1 , y_offset] [ 0 , 0 ,    1    ] 

So just premultiply your homography by a matrix similar to the above, and your output image will be offset.

(Make sure you use matrix multiplication, not element wise multiplication!)

like image 191
Matt Freeman Avatar answered Sep 18 '22 13:09

Matt Freeman