有誰知道我如何在OpenCV中圍繞另一個點旋轉一個點?用OpenCV圍繞一個點旋轉一個點
我正在尋找這樣的功能:
Point2f rotatePoint(Point2f p1, Point2f center, float angle)
{
/* MAGIC */
}
有誰知道我如何在OpenCV中圍繞另一個點旋轉一個點?用OpenCV圍繞一個點旋轉一個點
我正在尋找這樣的功能:
Point2f rotatePoint(Point2f p1, Point2f center, float angle)
{
/* MAGIC */
}
這是由α角,以繞另一點一個點所需要的步驟:
旋轉的標準方程是:
X '= X COS(阿爾法) - Ý罪(阿爾法)
Y'= X 罪(阿爾法)+ Y COS( alpha)
讓我們以點(2,2)的點(15,5)爲例來說明45度。
首先,翻譯:
V =(15,5) - (2,2)=(13,3)
現在,通過45°旋轉:
V =(13 * COS 45° - 3 *罪45°,13 *罪45°+ 3 *餘弦45°)=(7.07 ..,11.31 ..)
最後,轉換回:
v = v + (2,2)=(9.07 ..,13.31 ..)
注:角必須用弧度指定,因此受到Pi/180
乘以多少度如果你已經有了點的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.
這可能有助於
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;
}
要通過角a
旋轉點p1 = (x1, y1)
各地p (x0, y0)
:
x2 = ((x1 - x0) * cos(a)) - ((y1 - y0) * sin(a)) + x0;
y2 = ((x1 - x0) * sin(a)) + ((y1 - y0) * cos(a)) + y0;
其中(x2, y2)
是點的新位置p1
我一直在尋找爲反式形成一個圖像的任何像素座標,我很難找到它的搜索結果。不知怎的,我發現其正常工作,並且幫助我理解這個問題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]);
}
謝謝。問題解決了。 – user1021793
歡迎來到Stack Overflow。如果答案解決了你的問題,你應該接受它。請[閱讀關於接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 – SSteve
+1爲好的答案,但我會避免使用45°作爲測試用例,因爲正弦和餘弦相同。 –