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

问题描述

我正在使用 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,1.0e+00,5.0e+01,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,H3_1);
        std::cout << "p1 from p3: " << dst1[0] << std::endl;
    }
    catch (std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }

    std::cin.get();
}

结果:

enter image description here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...