有人知道如何在OpenCV中围绕另一个点旋转一个点吗?
我正在寻找这样的功能:
Point2f rotatePoint(Point2f p1, Point2f center, float angle)
{
/* MAGIC */
}
答案 0 :(得分:30)
这些是围绕另一个点旋转角度α所需的步骤:
轮换的标准公式是:
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]);
}