Có ai biết cách tôi có thể xoay một điểm quanh điểm khác trong OpenCV không?Xoay một điểm quanh một điểm với OpenCV
Tôi đang tìm kiếm một chức năng như thế này:
Point2f rotatePoint(Point2f p1, Point2f center, float angle)
{
/* MAGIC */
}
Có ai biết cách tôi có thể xoay một điểm quanh điểm khác trong OpenCV không?Xoay một điểm quanh một điểm với OpenCV
Tôi đang tìm kiếm một chức năng như thế này:
Point2f rotatePoint(Point2f p1, Point2f center, float angle)
{
/* MAGIC */
}
Đây là những bước cần thiết để xoay một điểm xung quanh điểm khác bằng một góc alpha:
Phương trình tiêu chuẩn cho luân chuyển là:
x '= x cos (alpha) - y sin (alpha)
y' = x sin (alpha) + y cos (alpha)
Hãy lấy ví dụ về điểm (15,5) xung quanh điểm (2,2) 45 độ.
Thứ nhất, dịch:
v = (15,5) - (2,2) = (13,3)
Bây giờ xoay 45 °:
v = (13 * cos 45 ° - 3 * sin 45 °, 13 * sin 45 ° + 3 * cos 45 °) = (7.07 .., 11,31 ..)
Và cuối cùng, dịch lại:
v = v + (2,2) = (9,07 .., 13,31 ..)
Lưu ý: Angles phải được xác định trong radian, vì vậy nhân số độ bởi Pi/180
Nếu bạn đã có điểm theo hình thức RotatedRect, bạn có thể thay đổi góc của nó để xoay điểm.
//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.
này có thể giúp
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;
}
Để xoay điểm p1 = (x1, y1)
xung quanh p (x0, y0)
bởi góc a
:
x2 = ((x1 - x0) * cos(a)) - ((y1 - y0) * sin(a)) + x0;
y2 = ((x1 - x0) * sin(a)) + ((y1 - y0) * cos(a)) + y0;
nơi (x2, y2)
là vị trí mới của điểm p1
tôi đang tìm kiếm cho trans hình thành bất kỳ tọa độ pixel nào của một Hình ảnh và tôi khó có thể tìm thấy điều đó bằng cách googling nó.Bằng cách nào đó tôi tìm thấy một liên kết mã python mà làm việc một cách chính xác và điều này đã giúp tôi hiểu vấn đề: https://cristianpb.github.io/blog/image-rotation-opencv
Sau đây là C++ mã tương ứng, nếu một số một là tìm kiếm nó:
// 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]);
}
Cảm ơn bạn . Đã giải quyết được sự cố. – user1021793
Chào mừng bạn đến với Stack Overflow. Nếu câu trả lời giải quyết được vấn đề của bạn, bạn nên chấp nhận nó. Vui lòng [đọc về chấp nhận câu trả lời] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). – SSteve
+1 cho một câu trả lời tốt, mặc dù tôi muốn tránh sử dụng 45 ° như một trường hợp thử nghiệm như sin và cosin là như nhau. –