OpenCV:找到旋转点的原始坐标

OpenCV: Find original coordinates of a rotated point

本文关键字:原始 坐标 旋转 OpenCV      更新时间:2023-10-16

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

    Point2i rotCenter;
    rotCenter.x = scaledFrame.cols / 2;
    rotCenter.y = scaledFrame.rows / 2;
    Mat rotationMatrix = getRotationMatrix2D(rotCenter, angle, 1);
    warpAffine(scaledFrame, scaledFrame, rotationMatrix, Size(scaledFrame.cols, scaledFrame.rows));

这工作得很好,我能够为眼睛提取两个ROI矩形。所以,我有每个ROI的上/左坐标以及它们的宽度和高度。然而,这些坐标是旋转图像中的坐标。我不知道怎么把这个矩形投影到原来的框架上。

假设我有未缩放帧(full_image)的眼睛对,但仍然旋转。

eye0_roi and eye1_roi

我如何将它们旋转回来,使它们映射到正确的位置?

最诚挚的问候,安德烈

您可以使用invertAffineTransform获得逆矩阵并使用该矩阵将点旋转回来:

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;
}