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

C++ OpenCV将仿射变换应用于单个点而不是整个图像,c++,opencv,C++,Opencv,我从KeypointBasedMotionEstimator类的OpenCV中得到了一个仿射变换矩阵 它的形式如下: [1.0008478, -0.0017408683, -10.667297; 0.0011812132, 1.0009096, -3.3626099; 0, 0, 1] 现在我想将变换应用于向量,这样它将变换图像中的每个点 OpenCV似乎不允许仅转换点,函数: void cv::warpAffine ( InputArray src, Outpu

我从KeypointBasedMotionEstimator类的OpenCV中得到了一个仿射变换矩阵

它的形式如下:

[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中的单个点?

这有点笨拙,但您可以手动对点进行矩阵乘法:

// 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;
你可以用

void cv::透视变换(输入阵列src、输出阵列dst、输入阵列m)

e、 g

cv::Mat yourAffineMatrix(3,3,cv_64FC1);
[…]//填写变换矩阵
std::向量点;
推后(cv::Point2f(4,4));
yourPoints.push_back(cv::Point2f(0,0));
std::向量转换点;
cv::透视变换(yourPoints、transformedPoints、yourAffineMatrix);
不确定点数据类型,但转换必须具有
double
类型,例如
CV\u 64FC1


参见文档中的方程式:
[-6.67087, 0.645753]
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);