在旋转 cv::Mat 而不裁剪后,将 cv::RotatedRect 移动到相同的位置
Moving cv::RotatedRect in the same position after rotating a cv::Mat without cropping
我目前很难理解在旋转图像而不裁剪的情况下转换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
.我很确定我只需要修改中心,但新位置总是有点偏离预期的位置。我最初希望我只需要添加bbox
和src
尺寸之间的差异即可获得我正在寻找的东西,但事实证明并非如此(当然包括旋转(。
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));
}
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 概念中的cv限定符需要表达式参数列表
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 将QGraphicsItem的移动区域限制在多边形区域内
- 移动语义和 cv::Mat
- 在旋转 cv::Mat 而不裁剪后,将 cv::RotatedRect 移动到相同的位置
- 将代码移动到 Opencv cv::P arallelLoopBody
- 将我的阵列移动到 Mat 并使用打开的 CV 显示图像