使用OpenCV旋转点周围的点

时间:2011-10-31 11:52:00

标签: c++ opencv rotation point

有人知道如何在OpenCV中围绕另一个点旋转一个点吗?

我正在寻找这样的功能:

Point2f rotatePoint(Point2f p1, Point2f center, float angle)
{
    /* MAGIC */
}

5 个答案:

答案 0 :(得分:30)

这些是围绕另一个点旋转角度α所需的步骤:

  1. 使用轴心点的负数翻译点
  2. 使用2-d(或3-d)旋转的标准公式旋转点
  3. 翻译
  4. 轮换的标准公式是:

    x'= x cos(alpha) - y sin(alpha)

    y'= x sin(alpha)+ y cos(alpha)

    让我们以点(2,2)周围45度的点(15,5)为例。

    首先,翻译:

    v =(15,5) - (2,2)=(13,3)

    现在旋转45°:

    v =(13 * cos 45° - 3 * sin 45°,13 * sin 45°+ 3 * cos 45°)=(7.07 ..,11.31 ..)

    最后,翻译回来:

    v = v +(2,2)=(9.07 ..,13.31 ..)

    注意:角度必须以弧度指定,因此将度数乘以Pi / 180

答案 1 :(得分:7)

要按p1 = (x1, y1)的角度p (x0, y0)左右旋转a点{/ 1}}:

x2 = ((x1 - x0) * cos(a)) - ((y1 - y0) * sin(a)) + x0;
y2 = ((x1 - x0) * sin(a)) + ((y1 - y0) * cos(a)) + y0;

其中(x2, y2)是点p1

的新位置

答案 2 :(得分:2)

如果您已经拥有RotatedRect形式的积分,则可以更改它的角度以旋转积分。

//RotatedRect myRect;
Point2f oldPoints[4];
myRect.points(oldPoints);  //gives existing points of the rectangle.
myRect.angle = 0;          //change the angle.
Point2f newPoints[4];
myRect.points(newPoints);  //gives rotated points of the rectangle.

答案 3 :(得分:2)

这可能会有所帮助

cv::Point2f rotate2d(const cv::Point2f& inPoint, const double& angRad)
{
    cv::Point2f outPoint;
    //CW rotation
    outPoint.x = std::cos(angRad)*inPoint.x - std::sin(angRad)*inPoint.y;
    outPoint.y = std::sin(angRad)*inPoint.x + std::cos(angRad)*inPoint.y;
    return outPoint;
}

cv::Point2f rotatePoint(const cv::Point2f& inPoint, const cv::Point2f& center, const double& angRad)
{
    return rotate2d(inPoint - center, angRad) + center;
}

答案 4 :(得分:1)

我正在寻找图像的任何像素坐标的转换,我很难通过谷歌搜索找到它。不知何故,我发现一个python代码链接正常工作,这有助于我理解这个问题: https://cristianpb.github.io/blog/image-rotation-opencv

以下是相应的C ++代码,如果有人正在寻找它:

// send the original angle and don't transform in radian
    cv::Point2f rotatePointUsingTransformationMat(const cv::Point2f& inPoint, const cv::Point2f& center, const double& rotAngle)
    {
        cv::Mat rot = cv::getRotationMatrix2D(center, rotAngle, 1.0);
        float cos = rot.at<double>(0,0);
        float sin = rot.at<double>(0,1);
        int newWidth = int( ((center.y*2)*sin) +  ((center.x*2)*cos) );
        int newHeight = int( ((center.y*2)*cos) +  ((center.x*2)*sin) );

        rot.at<double>(0,2) += newWidth/2.0 - center.x;
        rot.at<double>(1,2) += newHeight/2.0 - center.y;

        int v[3] = {static_cast<int>(inPoint.x),static_cast<int>(inPoint.y),1};
        int mat3[2][1] = {{0},{0}};

        for(int i=0; i<rot.rows; i++)
        {
            for(int j=0; j<= 0; j++)
            {
                int sum=0;
                for(int k=0; k<3; k++)
                {
                    sum = sum + rot.at<double>(i,k) * v[k];
                }
                mat3[i][j] = sum;
            }
        }
        return Point2f(mat3[0][0],mat3[1][0]);
    }