如何估计OpenCV的2D相似变换(直线形,无反射的相似性)?(How to estimate 2D

2019-08-16 22:03发布

我试图通过匹配SIFT描述和发现由RANSAC变换矩阵搜索中输入图像的特定对象。 对象只能在现场由相似性来修改2D空间变换(缩放,旋转,平移),所以我需要估计的2×2的变换矩阵,而不是3×3单应性矩阵在3D空间中。 我怎样才能在OpenCV中实现这一目标?

Answer 1:

您可以使用estimateRigidTransform (我不知道是否是RANSAC,在代码http://code.opencv.org/projects/opencv/repository/revisions/2.4.4/entry/modules/video/src/lkpyramid.cpp RANSAC说,在其评论),第三个参数被设置为false ,以得到公正规模+旋转+翻译:

#include <vector>
#include <iostream>
#include "opencv2/video/tracking.hpp"

int main( int argc, char** argv )
{
    std::vector<cv::Point2f> p1s,p2s;

    p1s.push_back(cv::Point2f( 1, 0));
    p1s.push_back(cv::Point2f( 0, 1));
    p1s.push_back(cv::Point2f(-1, 0));
    p1s.push_back(cv::Point2f( 0,-1));

    p2s.push_back(cv::Point2f(1+sqrt(2)/2, 1+sqrt(2)/2));
    p2s.push_back(cv::Point2f(1-sqrt(2)/2, 1+sqrt(2)/2));
    p2s.push_back(cv::Point2f(1-sqrt(2)/2, 1-sqrt(2)/2));
    p2s.push_back(cv::Point2f(1+sqrt(2)/2, 1-sqrt(2)/2));

    cv::Mat t = cv::estimateRigidTransform(p1s,p2s,false);

    std::cout << t << "\n";

    return 0;
}

编译和OpenCV的2.4.4测试。 输出是:

[0.7071067988872528, -0.7071067988872528, 1.000000029802322;
  0.7071067988872528, 0.7071067988872528, 1.000000029802322]


Answer 2:

您可以使用使用找到OpenCV的点将台之间的仿射变换,这是略多于你所描述的情况下(被称为相似变换),因为它描述的形状的剪切变换以及更普遍。

它可以使用函数来执行getAffineTransform(InputArray src, InputArray dst) 这需要2套的三点,并计算它们之间的仿射变换。



文章来源: How to estimate 2D similarity transformation (linear conformal, nonreflective similarity) in OpenCV?