C++ OpenCV:查找旋转点的原始坐标

C++ OpenCV:查找旋转点的原始坐标,c++,opencv,rotation,C++,Opencv,Rotation,我有以下问题。我正在用HaarClassifiers搜索图像中的眼睛。由于头部的旋转,我试图在不同角度内找到眼睛。为此,我将图像旋转不同角度。对于旋转框架,我使用以下代码(用C++编写): 这很好,我能够为眼睛提取两个ROI矩形。因此,我有每个ROI的上/左坐标以及它们的宽度和高度。但是,这些坐标是旋转图像中的坐标。我不知道如何将这个矩形反向投影到原始帧上 假设我获得了未缩放帧(完整图像)的眼睛对ROI,但仍然漫游 eye0_roi and eye1_roi 如何将它们旋转回来,以便它们映射到

我有以下问题。我正在用HaarClassifiers搜索图像中的眼睛。由于头部的旋转,我试图在不同角度内找到眼睛。为此,我将图像旋转不同角度。对于旋转框架,我使用以下代码(用C++编写):

这很好,我能够为眼睛提取两个ROI矩形。因此,我有每个ROI的上/左坐标以及它们的宽度和高度。但是,这些坐标是旋转图像中的坐标。我不知道如何将这个矩形反向投影到原始帧上

假设我获得了未缩放帧(完整图像)的眼睛对ROI,但仍然漫游

eye0_roi and eye1_roi
如何将它们旋转回来,以便它们映射到正确的位置

致以最良好的祝愿,
Andre

您可以使用
反仿射变换
获取逆矩阵,并使用该矩阵将点旋转回来:

Mat RotateImg(const Mat& img, double angle, Mat& invertMat)
{
    Point center = Point( img.cols/2, img.rows/2);
    double scale = 1;

    Mat warpMat = getRotationMatrix2D( center, angle, scale );
    Mat dst = Mat(img.size(), CV_8U, Scalar(128));
    warpAffine( img, dst, warpMat, img.size(), 1, 0, Scalar(255, 255, 255));
    invertAffineTransform(warpMat, invertMat);
    return dst;
}

Point RotateBackPoint(const Point& dstPoint, const Mat& invertMat)
{
    cv::Point orgPoint;
    orgPoint.x = invertMat.at<double>(0,0)*dstPoint.x + invertMat.at<double>(0,1)*dstPoint.y + invertMat.at<double>(0,2);
    orgPoint.y = invertMat.at<double>(1,0)*dstPoint.x + invertMat.at<double>(1,1)*dstPoint.y + invertMat.at<double>(1,2);
    return orgPoint;
}
Mat RotateImg(常数Mat&img、双角度、Mat&invertMat)
{
点中心=点(img.cols/2,img.rows/2);
双刻度=1;
Mat warpMat=getRotationMatrix2D(中心、角度、比例);
Mat dst=Mat(img.size(),CV_8U,标量(128));
warpAffine(img,dst,warpMat,img.size(),1,0,标量(255,255,255));
反仿射变换(warpMat,invertMat);
返回dst;
}
点旋转备份点(常量点和dstPoint、常量垫和反转垫)
{
cv::点或点;
orgPoint.x=在(0,0)处的内底材料*dstPoint.x+在(0,1)处的内底材料*dstPoint.y+在(0,2)处的内底材料;
orgPoint.y=在(1,0)处的内底材料*dstPoint.x+在(1,1)处的内底材料*dstPoint.y+在(1,2)处的内底材料;
返回点;
}

我认为您可以尝试使用相同的矩阵,但使用WARP\u INVERSE\u MAP标志和warpaffine函数
Mat RotateImg(const Mat& img, double angle, Mat& invertMat)
{
    Point center = Point( img.cols/2, img.rows/2);
    double scale = 1;

    Mat warpMat = getRotationMatrix2D( center, angle, scale );
    Mat dst = Mat(img.size(), CV_8U, Scalar(128));
    warpAffine( img, dst, warpMat, img.size(), 1, 0, Scalar(255, 255, 255));
    invertAffineTransform(warpMat, invertMat);
    return dst;
}

Point RotateBackPoint(const Point& dstPoint, const Mat& invertMat)
{
    cv::Point orgPoint;
    orgPoint.x = invertMat.at<double>(0,0)*dstPoint.x + invertMat.at<double>(0,1)*dstPoint.y + invertMat.at<double>(0,2);
    orgPoint.y = invertMat.at<double>(1,0)*dstPoint.x + invertMat.at<double>(1,1)*dstPoint.y + invertMat.at<double>(1,2);
    return orgPoint;
}