OpenCV 将仿射变换应用于单个点而不是整个图像

Sva*_*Lop 7 c++ opencv

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

它的形式如下:

[1.0008478, -0.0017408683, -10.667297;
0.0011812132, 1.0009096, -3.3626099;
0, 0, 1]
Run Code Online (Sandbox Code Playgroud)

我现在想将变换应用于向量< Pointf >,以便它会变换每个点,就像它们在图像中一样。

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

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

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

有没有办法可以对 OpenCV 中的单点应用仿射变换?

Mic*_*cka 8

您可以使用

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);
Run Code Online (Sandbox Code Playgroud)

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

看到http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#perspectivetransform


ber*_*rak 6

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

// 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;
Run Code Online (Sandbox Code Playgroud)
[-6.67087, 0.645753]
Run Code Online (Sandbox Code Playgroud)