zoukankan      html  css  js  c++  java
  • OpenCV,计算两幅图像的单应矩阵

    平面射影变换是关于其次3维矢量的一种线性变换,可以使用一个非奇异的$3 imes 3$矩阵H表示,$X' = HX$,射影变换也叫做单应(Homography)。计算出两幅图像之间的单应矩阵H,那么应用这个关系可以将一个视图中的

    所有点变换到另一个视图中。

    lenna4image

    上图,最右边图像是将最左边图像进行了一次射影变换,变换到中间图像视图后的图像。

    使用OpenCV可以调用库函数findHomography计算两幅图像的单应矩阵,其声明如下

    Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )

    单应矩阵的计算需要两幅图像中相对应的点,srcPoints,dstPoints是两幅图像中相对应的点,可以是Vector<Point2f>或者是CV_32FC2类型的矩阵,Method是计算单应矩阵时所使用的方法。

    得到了图像的单应矩阵H就可以使用函数warpPerspective将图像变换到另一个视图中

    void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

    下面就使用上面提到的两个函数,计算出两幅图像之间的单应矩阵H,并且将两幅图像合并为一副图像。

    image

    其操作过程非常简单,

    • 在“大”图像(目标图像)上选择4个点和“小”图像(被合并图像)的四角做对应,然后根据这4对对应的点计算两幅图像的单应矩阵。
    • 得到单应矩阵H后,利用函数warpPerspective将H应用到“小”图像上,得到图像M
    • 将图像M合并到目标图像中选择的四个点的位置

    实现

    首先定义两个vector保存对应的4对点

    //4对相对应的像点计算图像的单应 Homography
    vector<Point2f> left_image;
    vector<Point2f> right_image;

    将小图像的四角坐标插入到left_image中

    left_image.push_back(Point2f(0, 0));
        left_image.push_back(Point2f(0, image_logo.rows));
        left_image.push_back(Point2f(image_logo.cols, image_logo.rows));
        left_image.push_back(Point2f(image_logo.cols, 0));

    在在大图中选择4个点,并用这4对相对应的点计算单应矩阵H

    if (e == EVENT_LBUTTONDOWN){
    
            if (right_image.size() < 4){
    
                right_image.push_back(Point2f(float(x), float(y)));
                cout << x << " " << y << endl;
            }
            else {
    
                cout << "Calculating Homography" << endl;
                setMouseCallback("Display window", nullptr, nullptr);
                Mat H = findHomography(left_image, right_image, 0);
                Mat logoWarped;
                warpPerspective(image_logo, logoWarped,H, image_main.size());
                showFinal(image_main, logoWarped);
            }
        }

    最后,将logoWarped和main图像相加就得到最后结果。

    详细代码:https://github.com/brookicv/opencvSample/tree/master/Homography

  • 相关阅读:
    第四次
    jsp
    2021.3.4
    第八次作业
    第七次作业
    第六周作业
    第五周作业
    第四周
    第四次jsp作业
    第二次作业
  • 原文地址:https://www.cnblogs.com/wangguchangqing/p/4645805.html
Copyright © 2011-2022 走看看