我在轮换方面遇到了麻烦。 我想做的是:
我有点陷入第三步。
我设法使用以下代码旋转图像:
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);
这不是为了工作,但这些要点在图像上不能很好地回归。有一个偏移。
感谢您的帮助
答案 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
将其移回原始框架,其中r
为cv::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)
以下是我的代码。
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;