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

dav*_*vid 12 c++ opencv rotation matrix

我有轮换麻烦.我想要做的是:

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

我有点卡在第三步.

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

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));
Run Code Online (Sandbox Code Playgroud)

我尝试用这段代码回转点:

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);
Run Code Online (Sandbox Code Playgroud)

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

谢谢您的帮助

Fei*_*Fei 6

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

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);
Run Code Online (Sandbox Code Playgroud)

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


Sea*_*ean 3

对于旋转矩阵,其转置是其逆矩阵。因此,您可以将M.t() * r其移回原始框架,其中r是 a cv::Mat(您可能必须将其cv::Mat从 acv::Point2f或其他内容转换为 a,或者只是明确地写出矩阵乘法)。

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

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.
Run Code Online (Sandbox Code Playgroud)