如何旋转cv::RotatedRect?—— OpenCV

3

我如何对cv::rotatedRect应用某些转换(例如旋转)?尝试使用cv::warpAffine,但无法正常工作,因为它应该应用于cv::Mat...

3个回答

3
您可以直接使用内部变量 anglecentersize 控制旋转、平移和缩放。请参阅文档了解更多信息。
如果需要进行更一般的转换,则需要使用 points() 获取顶点,并使用例如 cv::warpAffine 进行操作,但是这样做后您将不再拥有一个 cv::rotatedRect(根据定义)。

是的,但是剩下的变量呢?我不需要改变它们吗? - manatttta
1
您可以直接使用内部变量控制旋转、平移和缩放。更一般的变换需要操作四个顶点(points()),但这样就不再有旋转矩形了... - Rosa Gronchi

3
如果您计划执行复杂的操作,如仿射透视,则应处理旋转矩形的点,结果可能是四边形而不是矩形。

cv::warpAffine适用于图像。您应该使用cv :: Transformcv :: Perspectivetransform

它们接受点数组并生成点数组。

示例:

cv::RotatedRect rect;
//fill rect somehow
cv::Point2f rect_corners[4];
rect.points(rect_corners);
std::vector<cv::Point2f> rect_corners_transformed(4);
cv::Mat M;
//fill M with affine transformation matrix
cv::transform(std::vector<cv::Point2f>(std::begin(rect_corners), std::end(rect_corners)), rect_corners_transformed, M);
// your transformed points are in rect_corners_transformed

1

TLDR: 创建一个新的矩形。

我不知道这是否会对你有所帮助,但我通过创建一个新的矩形并忽略旧的矩形来解决了类似的问题。换句话说,我计算了新角度,然后将其和旧矩形的值(中心点和大小)分配给了新矩形:

RotatedRect newRotatedRectangle(oldRectangle.center, oldRectangle.size, newAngle);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接