10

I'm running the cv::warpPerspective() function on a image and what to get the position of the some points of result image the I get in the source image, here how far I came :

 int main (){
    cv::Point2f srcQuad[4],dstQuad[4];
    cv::Mat warpMatrix;
    cv::Mat src, dst,src2;
    src = cv::imread("card.jpg",1);
            srcQuad[0].x = 0; //src Top left
    srcQuad[0].y = 0;
    srcQuad[1].x = src.cols - 1; //src Top right
    srcQuad[1].y = 0;
    srcQuad[2].x = 0; //src Bottom left
    srcQuad[2].y = src.rows - 1;
    srcQuad[3].x = src.cols -1; //src Bot right
    srcQuad[3].y = src.rows - 1;
    dstQuad[0].x = src.cols*0.05; //dst Top left
    dstQuad[0].y = src.rows*0.33;
    dstQuad[1].x = src.cols*0.9; //dst Top right
    dstQuad[1].y = src.rows*0.25;
    dstQuad[2].x = src.cols*0.2; //dst Bottom left
    dstQuad[2].y = src.rows*0.7;
    dstQuad[3].x = src.cols*0.8; //dst Bot right
    dstQuad[3].y = src.rows*0.9;

    warpMatrix =cv::getPerspectiveTransform(srcQuad,dstQuad);

    cv::warpPerspective(src,dst,warpMatrix,src.size());
    cv::imshow("source", src);
    cv::imshow("destination", dst);
    cv::warpPerspective(dst,src2,warpMatrix,dst.size(),CV_WARP_INVERSE_MAP);
    cv::imshow("srouce 2 " , src2);
    cv::waitKey();
    return 0;

my problem is that if I select a point from dst how can get its coordinates in ** src or src2 ** since the cv::warpPerspective function doesn't take cv::Point as parameter ??

Cœur
  • 37,241
  • 25
  • 195
  • 267
Engine
  • 5,360
  • 18
  • 84
  • 162

2 Answers2

10

You want perspectiveTransform (which works on a vector of Points) rather than warpPerspective. Take the inverse of warpMatrix; you may have to tweak the final column.

vector<Point2f> dstPoints, srcPoints;
dstPoints.push_back(Point2f(1,1));

cv::perspectiveTransform(dstPoints,srcPoints,warpMatrix.inv());
calumblair
  • 195
  • 6
7

A perspective transform relates two points in the following manner:

[x']   [m00 m01 m02] [x]
[y'] = [m10 m11 m12] [y]
[1]    [m20 m21 m22] [1]

Where (x,y) are the original 2D point coordinates, and (x', y') are the transformed coordinates.

In your case, you know (x', y'), and want to know (x, y). This can be achieved by multiplying the known point by the inverse of the transformation matrix:

cv::Matx33f warp = warpMatrix;          // cv::Matx is much more useful for math
cv::Point2f warped_point = dstQuad[3];  // I just use dstQuad as an example
cv::Point3f homogeneous = warp.inv() * warped_point;
cv::Point2f result(homogeneous.x, homogeneous.y);  // Drop the z=1 to get out of homogeneous coordinates
// now, result == srcQuad[3], which is what you wanted
Aurelius
  • 11,111
  • 3
  • 52
  • 69