如何估计OpenCV中的2D相似变换(线性共形,非反射相似性)?

时间:2013-02-12 12:53:47

标签: opencv image-processing computer-vision affinetransform homography

我正在尝试通过匹配SIFT描述符并通过RANSAC查找转换矩阵来搜索输入图像中的特定对象。该对象只能通过2D空间中的相似变换(缩放,旋转,平移)在场景中进行修改,因此我需要在3D空间中估计2x2变换矩阵而不是3x3单应矩阵。我怎样才能在OpenCV中实现这一目标?

2 个答案:

答案 0 :(得分:5)

您可以使用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]

答案 1 :(得分:2)

您可以使用opencv在点集之间查找仿射变换,这比您描述的情况(称为相似变换)稍微更为通用,因为它也描述了形状的剪切变换。

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