¿Alguien sabe cómo puedo rotar un punto alrededor de otro en OpenCV?Gire un punto alrededor de un punto con OpenCV
Busco a una función como esta:
Point2f rotatePoint(Point2f p1, Point2f center, float angle)
{
/* MAGIC */
}
¿Alguien sabe cómo puedo rotar un punto alrededor de otro en OpenCV?Gire un punto alrededor de un punto con OpenCV
Busco a una función como esta:
Point2f rotatePoint(Point2f p1, Point2f center, float angle)
{
/* MAGIC */
}
Estos son los pasos necesarios para hacer girar un punto alrededor de otro punto por un ángulo alfa:
la ecuación estándar para la rotación es:
x '= x cos (alfa) - Y sen (alfa)
y' = x sen (alfa) + y cos (alpha)
Tomemos el ejemplo del Punto (15,5) alrededor del Punto (2,2) por 45 grados.
En primer lugar, traducir:
v = (15,5) - (2,2) = (13,3)
Ahora gire por 45 °:
v = (13 * cos 45 ° - 3 * sen 45 °, 13 ° * sen 45 + 3 * cos 45 °) = (7,07 .., .. 11.31)
Y, por último, traducir vuelta:
v = v + (2,2) = (9.07 .., 13.31 ..)
Nota: Los ángulos deben especificarse en radianes, por lo que multiplica el número de grados por Pi/180
Si ya tiene puntos en forma de RotatedRect, puede cambiar el ángulo de la misma para hacer girar los puntos.
//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.
Esto podría ayudar
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;
}
Para rotar el punto p1 = (x1, y1)
alrededor p (x0, y0)
por el ángulo a
:
x2 = ((x1 - x0) * cos(a)) - ((y1 - y0) * sin(a)) + x0;
y2 = ((x1 - x0) * sin(a)) + ((y1 - y0) * cos(a)) + y0;
donde (x2, y2)
es la nueva ubicación del punto de p1
que estaba buscando para la trans formación de cualquier coordenada de píxel de una imagen y no podría encontrarlo al buscar en Google.De alguna manera me encontré con un enlace de código Python, que funciona correctamente y que me ayudó a entender el problema: https://cristianpb.github.io/blog/image-rotation-opencv
El siguiente es el código correspondiente C++, si alguien lo está buscando:
// 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]);
}
Gracias . Problema resuelto. – user1021793
Bienvenido a Stack Overflow. Si una respuesta resuelve tu problema, debes aceptarlo. Por favor [lea sobre aceptar respuestas] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). – SSteve
+1 para una buena respuesta, aunque evitaría usar 45 ° como caso de prueba ya que el seno y el coseno son iguales. –