opencv - 如何在 OpenCV 中估计二维相似性变换(线性共形、非反射相似性)?

标签 opencv image-processing computer-vision affinetransform homography

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

最佳答案

您可以使用 estimateRigidTransform (不知道是不是RANSAC,http://code.opencv.org/projects/opencv/repository/revisions/2.4.4/entry/modules/video/src/lkpyramid.cpp处的代码在注释中说是RANSAC),第三个参数设置为false,为了得到just scale+rotation+translation:

#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]

关于opencv - 如何在 OpenCV 中估计二维相似性变换(线性共形、非反射相似性)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14833049/

相关文章:

python - 在 opencv 3.x 中设置 FPS

c++ - 为什么 aHash 比 dHash 效果更好?

numpy - FFT 卷积如何以及为什么比直接卷积更快?

opencv - 如何使用 OpenCV 在无需人工交互的情况下分割图像中的对象

python - 如何检测图表区域并从研究论文的图像中提取(裁剪)它

python - 使用 OpenCV 或 Matplotlib 的图像选项卡

opencv - bundle 调整功能

opencv - 如何在 OpenCV 中制作 double CvSeq?

javascript - 获取图像顶部 strip 的 rgba 值

actionscript-3 - 检测大量损坏金钱