在OpenCV中旋转旋转图像的后点

时间:2011-07-28 20:05:59

标签: c++ opencv matrix rotation

我在轮换方面遇到了麻烦。 我想做的是:

  • 旋转图像
  • 检测旋转图像上的要素(点)
  • 向后旋转点,以便我可以得到与初始图像对应的点坐标

我有点陷入第三步。

我设法使用以下代码旋转图像:

cv::Mat M(2, 3, CV_32FC1);
cv::Point2f center((float)dst_img.rows / 2.0f, (float)dst_img.cols / 2.0f);
M = cv::getRotationMatrix2D(center, rotateAngle, 1.0);
cv::warpAffine(dst_img, rotated, M, cv::Size(rotated.cols, rotated.rows));

我尝试使用以下代码旋转点:

float xp = r.x * std::cos( PI * (-rotateAngle) / 180 ) - r.y * sin(PI * (rotateAngle) / 180);
float yp = r.x * sin(PI * (-rotateAngle) / 180) + r.y * cos(PI * (rotateAngle) / 180);

这不是为了工作,但这些要点在图像上不能很好地回归。有一个偏移。

感谢您的帮助

4 个答案:

答案 0 :(得分:6)

如果M是您从cv::getRotationMatrix2D获得的旋转矩阵,要使用此矩阵旋转cv::Point p,您可以执行以下操作:

cv::Point result;
result.x = M.at<double>(0,0)*p.x + M.at<double>(0,1)*p.y + M.at<double>(0,2);
result.y = M.at<double>(1,0)*p.x + M.at<double>(1,1)*p.y + M.at<double>(1,2);

如果要将点旋转回来,请生成M的逆矩阵或使用cv::getRotationMatrix2D(center, -rotateAngle, scale)生成反向旋转矩阵。

答案 1 :(得分:3)

对于旋转矩阵,其转置是反向的。因此,您可以M.t() * r将其移回原始框架,其中rcv::Mat(您可能需要将其从{cv::Mat转换为cv::Point2f 1}}或者其他什么,或者只是明确地写出矩阵乘法。

以下是明确执行此操作的代码(应该是正确的,但警告,它完全未经测试):

cv::Point2f p;
p.x = M.at<float>(0, 0) * r.x + M.at<float>(1, 0) * r.y;
p.y = M.at<float>(0, 1) * r.x + M.at<float>(1, 1) * r.y;
// p contains r rotated back to the original frame.

答案 2 :(得分:1)

我遇到了同样的问题。

对于旋转图像中的变换M和点pp,我们希望在原始图像的coordanates中找到点pp_org。使用以下行:

cv::Mat_<double> iM;
cv::invertAffineTransform(M, iM);
cv::Point2f pp_org = iM*pp;

上述行中的运算符*定义为:

cv::Point2f operator*(cv::Mat_<double> M, const cv::Point2f& p)
{ 
    cv::Mat_<double> src(3/*rows*/,1 /* cols */); 

    src(0,0)=p.x; 
    src(1,0)=p.y; 
    src(2,0)=1.0; 

    cv::Mat_<double> dst = M*src; //USE MATRIX ALGEBRA 
    return cv::Point2f(dst(0,0),dst(1,0)); 
} 

注意: M是您用于从原始图像转换为旋转图像的旋转矩阵

答案 3 :(得分:0)

  • 您需要根据图像的中心点旋转点数。
  • 此处x和y是您想要旋转的点,imageCenter_x a和_y是图像的中心点。
  • 以下是我的代码。

    angle = angle * (M_PI / 180);  
    float axis_x = x - imageCenter_x;  
    float axis_y = y - imageCenter_y;       
    
    x = axis_x * cos(angle) + axis_y * sin(angle);   
    y = (-axis_x) * sin(angle) + axis_y * cos(angle);
    
    x = x + imageCenter_x;  
    y = y + imageCenter_y;