के साथ एक बिंदु के चारों ओर एक बिंदु घुमाएं क्या कोई जानता है कि मैं ओपनसीवी में किसी अन्य बिंदु को कैसे घुमा सकता हूं?ओपनसीवी
मैं इस तरह एक समारोह रहा हूँ:
Point2f rotatePoint(Point2f p1, Point2f center, float angle)
{
/* MAGIC */
}
के साथ एक बिंदु के चारों ओर एक बिंदु घुमाएं क्या कोई जानता है कि मैं ओपनसीवी में किसी अन्य बिंदु को कैसे घुमा सकता हूं?ओपनसीवी
मैं इस तरह एक समारोह रहा हूँ:
Point2f rotatePoint(Point2f p1, Point2f center, float angle)
{
/* MAGIC */
}
ये कदम एक कोण अल्फा द्वारा एक और बिंदु के आसपास एक बिंदु बारी बारी से करने के लिए आवश्यक हैं:
रोटेशन के लिए मानक समीकरण है:
एक्स '= एक्स क्योंकि (अल्फा) - y पाप (अल्फा)
वाई' = एक्स पाप (अल्फा) + y cos (अल्फा)
चलिए बिंदु (15,5) प्वाइंट (2,2) के आसपास 45 डिग्री से उदाहरण का उदाहरण लें।
सबसे पहले, का अनुवाद:
वी = (15,5) - (2,2) = (13,3)
अब 45 डिग्री से बारी बारी से:
वी = (13 * 45 क्योंकि ° - 3 * पाप 45 डिग्री, 13 * पाप 45 ° + 3 * क्योंकि 45 डिग्री) = (7.07 .. 11.31 ..)
और अंत में, पीठ का अनुवाद:
वी = 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
मैं देख रहा था है ट्रांस के लिए किसी छवि के किसी भी पिक्सेल समन्वय का गठन और मुझे शायद ही इसे गुगल करके मिल जाए। https://cristianpb.github.io/blog/image-rotation-opencv
निम्नलिखित, इसी सी ++ कोड है अगर कुछ एक यह की तलाश में है:
// 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
स्टैक ओवरफ़्लो में आपका स्वागत है। अगर कोई जवाब आपकी समस्या हल करता है तो आपको इसे स्वीकार करना चाहिए। कृपया [उत्तरों को स्वीकार करने के बारे में पढ़ें] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)। – SSteve
+1 एक अच्छे उत्तर के लिए, हालांकि मैं टेस्ट केस के रूप में 45 डिग्री का उपयोग करने से बचूंगा क्योंकि साइन और कोसाइन समान हैं। –