在旋转 cv::Mat 而不裁剪后,将 cv::RotatedRect 移动到相同的位置

Moving cv::RotatedRect in the same position after rotating a cv::Mat without cropping

本文关键字:cv 移动 RotatedRect 位置 Mat 旋转 裁剪      更新时间:2023-10-16

我目前很难理解在旋转图像而不裁剪的情况下转换cv::RotatedRect需要什么,使用Lars Schillingmann在这个问题中的以下代码。

以下是他作为答案提供的代码:

#include "opencv2/opencv.hpp"
int main()
{
cv::Mat src = cv::imread("im.png", CV_LOAD_IMAGE_UNCHANGED);
double angle = -45;
// get rotation matrix for rotating the image around its center in pixel coordinates
cv::Point2f center((src.cols-1)/2.0, (src.rows-1)/2.0);
cv::Mat rot = cv::getRotationMatrix2D(center, angle, 1.0);
// determine bounding rectangle, center not relevant
cv::Rect2f bbox = cv::RotatedRect(cv::Point2f(), src.size(), angle).boundingRect2f();
// adjust transformation matrix
rot.at<double>(0,2) += bbox.width/2.0 - src.cols/2.0;
rot.at<double>(1,2) += bbox.height/2.0 - src.rows/2.0;
cv::Mat dst;
cv::warpAffine(src, dst, rot, bbox.size());
cv::imwrite("rotated_im.png", dst);
return 0;
}

就我而言,我有一个与src图像中的某个位置匹配的cv::RotatedRect。在将变换/旋转应用于src垫后,此cv::RotatedRect应与相同的位置匹配。 目前,我正在努力以正确的方式做到这一点。

据我所知,要旋转cv::RotatedRect,只需要直接修改结构的成员,例如angle.我很确定我只需要修改中心,但新位置总是有点偏离预期的位置。我最初希望我只需要添加bboxsrc尺寸之间的差异即可获得我正在寻找的东西,但事实证明并非如此(当然包括旋转(。

connected_components[i].center.x += ...
connected_components[i].center.y += ...
cv::RotatedRect newRect(connected_components[i].center, connected_components[i].size, connected_components[i].angle- median);

答案很简单。我们可以使用cv::transform重用变换矩阵进行点变换。示例代码如下:

cv::Point2f points[4];
connected_components[i].points(points);
std::vector<cv::Point2f> old_points;
old_points.insert(old_points.begin(), std::begin(points), std::end(points));
std::vector<cv::Point2f> new_points;
cv::transform(old_points, new_points, rotation_matrix);
for (unsigned int j = 0; j < 4; ++j) {
cv::line(dest, new_points[j], new_points[(j + 1) % 4], cv::Scalar(0, 255, 0));
}