OpenCV warpAffine相对于任意点旋转

时间:2015-08-07 14:13:20

标签: c++ opencv image-processing image-rotation affinetransform

我在C ++中使用OpenCV。我有两张脸的图像,我试图将脸对齐。我有表示眼睛,鼻子和脸上其他兴趣点的特征。我使用Arun的方法来提取旋转,平移和缩放,将一个图像中的特征集的质心转换为另一个图像。然后,它旋转并缩放它。而且我正在尝试使用此变换来扭曲一个图像,以使图像中的面部与另一个图像中的面部对齐。至少这是个主意,但我遇到了问题。似乎旋转和平移的执行顺序与warpAffine中的预期顺序不同。行/列排序与x / y坐标似乎也存在问题。另外,正如标题所暗示的那样,我认为warpAffine正在对图像中的0,0进行操作,而我希望它们可以围绕面部点的质心进行。我应该怎么做才能正确对齐这两组点?这是我的代码:

// R is the rotation as computed by Arun's method
// centered_moving is the moving points with the centroid subtracted from them
// same with centered_base
for (int i = 0; i < base.cols; i++)
{
    a = centered_base.col(i);
    b = centered_moving.col(i).t();
    H += a*b;
}
SVD sv;
Mat W, U, Vt;
sv.compute(H, W, U, Vt);
Mat R = (Vt.t())*(U.t());
// centroid_moving and centroid_base are the centroids of the two point clouds, moving is the cloud that will be translated
Mat trans = -centroid_moving + centroid_base;
Mat Afmat = Mat::zeros(2, 3, ddepth);
Mat tmpmat = Afmat(Rect(0, 0, 2, 2));
R = Mat::eye(2, 2, ddepth);
R.copyTo(tmpmat);
Afmat.at<double>(1, 2) = trans.at<double>(0);
Afmat.at<double>(0, 2) = trans.at<double>(1);
warpAffine(image_moving, affine_result, Afmat, image_moving.size());

1 个答案:

答案 0 :(得分:0)

问题是我在行,列顺序中使用点,而warpAffine想要从x,y顺序(也就是列,行)中的点派生的矩阵。翻转点并使用getAffineTransform解决了这个问题。