如何计算两次透视变换后的结果?

How to compute the result after two perspective transformations?

我正在使用 OpenCV 进行图像拼接项目。现在我有了 img1 和 img2 之间的单应性 H1,以及 img2 和 img3 之间的单应性 H2。现在我需要计算 img1 和 img3 之间的单应性,简单地乘以 H1*H2 是行不通的。

有什么想法可以计算 img1 和 img3 之间的新单应性吗?

对我来说,计算 H1 * H2 效果很好,并给出了正确的结果。 这里,H1 = H2_1 因为它从 image2 扭曲到 image1。 H2 = H3_2 因为它从 image3 扭曲到 image2。 H1 * H2 = H3_1 因为它从图像 3 扭曲到图像 1。

int main()
{
    try {
        cv::Mat H2_1 = (cv::Mat_<double>(3, 3) << 1.0e+00, 0.0e+00, 1.8e+03, 0.0e+00, 1.0e+00, 5.0e+01, 0.0e+00, 0.0e+00, 1.0e+00);
        cv::Mat H3_2 = (cv::Mat_<double>(3, 3) << 0.949534471, -0.00581765975, 66.7917766, -0.0113810490, 0.981450515, -0.672362563, -0.000147974585, 0.00000992770511, 1.0);


        cv::Mat H3_1 = H2_1 * H3_2;

        cv::Point2f p3(500, 500);

        std::vector<cv::Point2f> src3;
        src3.push_back( p3 );
        src3.push_back(p3);
        std::vector<cv::Point2f> dst2;

        cv::perspectiveTransform(src3, dst2, H3_2);
        std::cout << "p1: " << p3 << std::endl;
        std::cout << "p2: " << dst2[0] << std::endl;

        std::vector<cv::Point2f> dst1;
        cv::perspectiveTransform(dst2, dst1, H2_1);
        std::cout << "p1 from p2: " << dst1[0] << std::endl;

        dst1.clear();
        cv::perspectiveTransform(src3, dst1, H3_1);
        std::cout << "p1 from p3: " << dst1[0] << std::endl;
    }
    catch (std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }

    std::cin.get();
}

结果: