2011-10-31 15 views
13

के साथ एक बिंदु के चारों ओर एक बिंदु घुमाएं क्या कोई जानता है कि मैं ओपनसीवी में किसी अन्य बिंदु को कैसे घुमा सकता हूं?ओपनसीवी

मैं इस तरह एक समारोह रहा हूँ:

Point2f rotatePoint(Point2f p1, Point2f center, float angle) 
{ 
    /* MAGIC */ 
} 

उत्तर

26

ये कदम एक कोण अल्फा द्वारा एक और बिंदु के आसपास एक बिंदु बारी बारी से करने के लिए आवश्यक हैं:

  1. बिंदु अनुवाद के नकारात्मक द्वारा पिवट पॉइंट
  2. 2-डी (या 3-डी) रोटेशन
  3. के लिए मानक समीकरण का उपयोग करके बिंदु को घुमाएं
  4. वापस अनुवाद करें

रोटेशन के लिए मानक समीकरण है:

एक्स '= एक्स क्योंकि (अल्फा) - 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

+0

धन्यवाद किसी तरह मैं अजगर कोड है जो सही ढंग से काम करते हैं और जो मुझे मदद मिली मुद्दे को समझने के में से एक लिंक मिल गया । समस्या सुलझ गयी। – user1021793

+0

स्टैक ओवरफ़्लो में आपका स्वागत है। अगर कोई जवाब आपकी समस्या हल करता है तो आपको इसे स्वीकार करना चाहिए। कृपया [उत्तरों को स्वीकार करने के बारे में पढ़ें] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)। – SSteve

+3

+1 एक अच्छे उत्तर के लिए, हालांकि मैं टेस्ट केस के रूप में 45 डिग्री का उपयोग करने से बचूंगा क्योंकि साइन और कोसाइन समान हैं। –

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. 
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; 
} 
6

कोण 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

1

मैं देख रहा था है ट्रांस के लिए किसी छवि के किसी भी पिक्सेल समन्वय का गठन और मुझे शायद ही इसे गुगल करके मिल जाए। 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]); 
    }