C++ 原始图像中ROI的坐标变换

C++ 原始图像中ROI的坐标变换,c++,opencv,math,affinetransform,C++,Opencv,Math,Affinetransform,我在一些投影和几何方面有点问题。我有一个图像,我检测到一个正方形。在正方形检测之后,我从图像中裁剪正方形。在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<squar

我在一些投影和几何方面有点问题。我有一个图像,我检测到一个正方形。在正方形检测之后,我从图像中裁剪正方形。在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];
}
vectorrect(squares.size());

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


在您正在使用的API中,可能有一种方法可以做到这一点,而不是重新设计轮子。

我已使用从rect[I]知道的角度旋转了点p.angle。现在我需要知道ROI的偏移量。问题来了。如果我使用locateROI,它不起作用,因为我的ROI是由RotatedRect生成的。对于我的问题,我需要首先将点旋转回来(旋转完成),然后对其进行平移。这里是我的平移问题。一旦“取消旋转”点,然后只需将其平移到剪裁矩形中映射到(0,0)的原始坐标我没有ROI的原点(例如(0,0))。正方形顶点的索引正在更改。它们不是旋转不变的。然后迭代穿过正方形的顶点,直到找到最左边的顶点(最低x值)。如果存在平局,请选择y值较低的顶点。将此值添加到“未旋转”的P值中解决它!感谢您的帮助!