【问题标题】:Coordinate transform from ROI in original image原始图像中 ROI 的坐标变换
【发布时间】:2016-03-09 14:14:31
【问题描述】:

我对一些投影和几何有一点问题。我有一个图像,我检测到一个正方形。正方形检测后,我从图像中裁剪正方形。在 ROI 中,我检测到点 P(x,y)(见下图)。

我的问题是我知道 ROI 中点 P 的坐标、A、B、C、D 的坐标和 ROI 的旋转 (RotatedRect::angle) 但我想获得原始 P 的坐标图片。任何建议都会有所帮助。

对于 ROI 作物,我有此代码

vector< RotatedRect > rect(squares.size());

for (int i=0;i<squares.size();i++) 
{
    rect[i] = minAreaRect(Mat(squares[i]));
    Mat M,rotated,cropped;
    float angle = rect[i].angle;
    Size rect_size = rect[i].size;

    if (rect[i].angle<-45)
    {
        angle += 90;
        swap(rect_size.width,rect_size.height);
    }

    M = getRotationMatrix2D(rect[i].center,angle,1.0);
    warpAffine(cameraFeed,rotated,M,cameraFeed.size(),INTER_CUBIC);
    getRectSubPix(rotated,rect_size,rect[i].center,cropped);
    cropped.copyTo(SatelliteClass[i].m_matROIcropped);
    SatelliteClass[i].m_vecRect = rect[i];
}

【问题讨论】:

    标签: c++ opencv math affinetransform


    【解决方案1】:

    这基本上是一个向量加法的问题。取 M 的倒数,将其应用于 P(因此您将 P 旋转回原始帧),然后将 P 添加到矩形的左角。

    可能有一种方法可以在您正在使用的 API 中执行此操作,而不是重新发明轮子。

    【讨论】:

    • 我已经用从 rect[i].angle 知道的角度旋转了点 P。现在我需要知道 ROI 的偏移量。问题来了。如果我使用 locateROI,它就不起作用,因为我的 ROI 是用 RotatedRect 制作的。对于我的问题,我需要先旋转该点(旋转完成)然后翻译它。这是我的翻译问题。
    • 一旦你“取消旋转”该点,然后将其转换为映射到剪切矩形中 (0,0) 的原始坐标
    • 我没有 ROI 的来源(例如 (0,0))。正方形顶点的索引正在变化。它们不是旋转不变的。
    • 然后遍历正方形的顶点,直到找到最左边的顶点(最低 x 值)。如果存在平局,则选择 y 值较低的顶点。将此值添加到“未旋转”的 P 值
    • 解决了!感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2013-05-22
    • 2022-11-19
    相关资源
    最近更新 更多