【问题标题】:OpenCV Applying Affine transform to single points rather than entire imageOpenCV将仿射变换应用于单个点而不是整个图像
【发布时间】:2015-05-12 14:42:34
【问题描述】:

我在 OpenCV 中从 KeypointBasedMotionEstimator 类获得了一个仿射变换矩阵。

它的形式如下:

[1.0008478, -0.0017408683, -10.667297;
0.0011812132, 1.0009096, -3.3626099;
0, 0, 1]

我现在想将变换应用到一个向量,这样它就会变换每个点,就像它们在图像中一样。

OpenCV 似乎不允许只转换点,函数:

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

似乎只将图像作为输入和输出。

有没有一种方法可以将仿射变换应用于 OpenCV 中的单点?

【问题讨论】:

标签: c++ opencv


【解决方案1】:

你可以使用

void cv::perspectiveTransform(InputArray src, OutputArray dst, InputArray m)

例如

cv::Mat yourAffineMatrix(3,3,CV_64FC1);
[...] // fill your transformation matrix

std::vector<cv::Point2f> yourPoints;
yourPoints.push_back(cv::Point2f(4,4));
yourPoints.push_back(cv::Point2f(0,0));

std::vector<cv::Point2f> transformedPoints;

cv::perspectiveTransform(yourPoints, transformedPoints, yourAffineMatrix);

不确定 Point 数据类型,但转换必须具有 double 类型,例如CV_64FC1

也见http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#perspectivetransform

【讨论】:

    【解决方案2】:

    这有点笨拙,但您可以手动将点乘以矩阵:

    // the transformation matrix
    Mat_<float> M(3,3); 
    M << 1.0008478, -0.0017408683, -10.667297,
         0.0011812132, 1.0009096, -3.3626099,
         0, 0, 1;
    
    // a point
    Point2f p(4,4);
    
    // make a Mat for multiplication, 
    // must have same type as transformation mat !
    Mat_<float> pm(3,1);
    pm << p.x,p.y,1.0;
    
    // now , just multiply:
    Mat_<float> pr =  M * pm;
    
    // retrieve point:    
    Point2f pt(pr(0), pr(1));
    cerr << pt << endl;
    

    [-6.67087, 0.645753]
    

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多