8

私は画像で cv::warpPerspective() 関数を実行しています。結果画像のいくつかのポイントの位置を取得する方法は、ソース画像で取得したものです。ここで、どこまで来たか:

 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;

私の問題は、 cv::warpPerspective関数が cv::Point をパラメーターとしてとらないため、 dstからポイントを選択した場合、** src または src2 ** でその座標を取得する方法です??

4

2 に答える 2

6

透視変換は、次の方法で 2 つの点を関連付けます。

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

(x,y)元の 2D ポイント座標はどこにあり(x', y')、 は変換された座標です。

あなたの場合、あなたは知っていて(x', y')、知りたいと思ってい(x, y)ます。これは、既知の点に変換行列の逆数を掛けることで実現できます。

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
于 2013-07-25T16:12:40.177 に答える