opencv - 给定一组点,如何计算相似变换(平移、缩放、旋转)?

标签 opencv math affinetransform

我正在尝试通过仿射变形来注册人脸,但我注意到有时它会倾斜太多。我想计算一个没有剪切/倾斜分量但仍保持配准误差最小二乘误差条件的变换矩阵。我怎样才能做到这一点?以下是我如何进行仿射变换。

#include "opencv2/opencv.hpp"
using namespace cv;
int main(int ac, char* av[])
{ 
    vector<Point2f> src;
    vector<Point2f> dst;
    src.push_back(Point2f(100,100));
    src.push_back(Point2f(150,150));
    src.push_back(Point2f(200,200));

    dst.push_back(Point2f(50,100));
    dst.push_back(Point2f(150,150));
    dst.push_back(Point2f(210,220));

    // we want M,solve for it using the following
    // M * U = X
    // M = X * inv(U)
    Mat U=Mat::ones(3,3,CV_32FC1);
    Mat X=Mat::ones(2,3,CV_32FC1);

    U.at<float>(0,0)=dst[0].x;
    U.at<float>(0,1)=dst[1].x;
    U.at<float>(0,2)=dst[2].x;
    U.at<float>(1,0)=dst[0].y;
    U.at<float>(1,1)=dst[1].y;
    U.at<float>(1,2)=dst[2].y;

    X.at<float>(0,0)=src[0].x;
    X.at<float>(0,1)=src[1].x;
    X.at<float>(0,2)=src[2].x;
    X.at<float>(1,0)=src[0].y;
    X.at<float>(1,1)=src[1].y;
    X.at<float>(1,2)=src[2].y;

    Mat M = X *  U.inv();

    //now we have the transform matrix M, we can apply this to any x,y and get the source corrdinates
    float x=20,y=20;
    Mat DST=Mat::zeros(3,1,CV_32FC1);
    DST.at<float>(0,0)=x;
    DST.at<float>(1,0)=y;
    DST.at<float>(2,0)=1;
    Mat SRC = M*DST;
    float xf =SRC.at<float>(0,0);
    float yf =SRC.at<float>(1,0);

    //interpolation etc

    return 0;
}    

最佳答案

OpenCV 的相似变换是 cv::estimateRigidTransform,它允许您根据您选择的参数计算 4 自由度(相似变换)或 6 自由度(全仿射)变换。

查看链接了解更多详情:

http://docs.opencv.org/modules/video/doc/motion_analysis_and_object_tracking.html#estimaterigidtransform

但我不确定为什么它没有为您的某些输入找到解决方案。请尝试使用点向量而不是矩阵。我见过这样的情况(尽管是 findHomography),OpenCV 将 3x2 矩阵(3 个点,每个 2 个维度)误解为 2 个点,每个 3 个维度,反之亦然。

关于opencv - 给定一组点,如何计算相似变换(平移、缩放、旋转)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25904516/

相关文章:

matlab - 在 OpenCV 程序中使用 MATLAB cameraParams

php - 计算浮点幂 (PHP/BCMath)

iphone - MKMapView 旋转的经验

java - 将旋转的图像堆叠成一张组合图像

ios - iOS 中 CGPointApplyAffineTransform 函数的公式

c++ - 更正 gtk、gtkmm 和 opencv 的 CMakeLists.txt 文件

visual-c++ - OpenCV:如何在编写视频时为每个帧设置延迟时间

opencv - 如何使用词袋进行训练和预测?

c - 64位除以32位

jquery - 为什么使用 jQuery 除法并转换为百分比时数字会发生变化?