2017-09-19 4 views
0

Current Way pour obtenir l'angle de rotation.Y a-t-il un meilleur moyen (augmentation de la performance/fonctions intégrées) pour obtenir l'angle de rotation d'un rectangle?

cv::Rect rRect(pTopLeft.x,pTopLeft.y,pBottomRight.x-pTopLeft.x,pBottomRight.y-pTopLeft.y); 

img(rRect); 

std::vector<cv::Point> points; 
cv::Mat_<uchar>::iterator it = img.begin<uchar>(); 
cv::Mat_<uchar>::iterator end = img.end<uchar>(); 
for (; it != end; ++it) 
    if (*it) 
     points.push_back(it.pos()); 

cv::RotatedRect box = cv::minAreaRect(cv::Mat(points)); 
double angle = box.angle; 

if (angle < -45.) 
    angle += 90.; 

est-il un moyen de ne pas éviter de boucle et obtenir directement l'angle du Rect en utilisant seulement rRect ou sont-il des fonctions dans OpenCV pour encastrables obtenir l'angle à l'aide Rect?

+0

questions demandant des moyens "meilleurs" pour faire quelque chose sont hors sujet comme étant trop vague et orientée opinion. si rien d'autre, vous devez spécifier quel aspect vous souhaitez améliorer - mais rappelez-vous que les revues de code stylistiques ne sont jamais sujet ici. – xaxxon

+0

Je suis en train de voter pour fermer cette question hors-sujet parce que c'est vraiment beaucoup trop large pour Stack Overflow, qui traite des problèmes de codage plus ciblés que cela. Pour obtenir des conseils sur l'amélioration du code de travail, envisagez d'utiliser [codereview.se] à la place - mais lisez d'abord [Guide de la révision de code pour les utilisateurs de Stack Overflow] (// codereview.meta.stackexchange.com/a/5778), car certaines fait différemment là-bas! –

+0

J'ai édité la question pour la rendre plus spécifique –

Répondre

0

Si nous avons des points carrés, nous pouvons faire ce qui suit.

cv::Mat debugSquares(std::vector<std::vector<cv::Point> > squares, cv::Mat image) 
{ 
    for (int i = 0; i< squares.size(); i++) { 
     // draw contour 
     cv::drawContours(image, squares, i, cv::Scalar(255,0,0), 1, 8, std::vector<cv::Vec4i>(), 0, cv::Point()); 

     // draw bounding rect 
     cv::Rect rect = boundingRect(cv::Mat(squares[i])); 
     cv::rectangle(image, rect.tl(), rect.br(), cv::Scalar(0,255,0), 1, 8, 0); 

     // draw rotated rect 
     cv::RotatedRect minRect = minAreaRect(cv::Mat(squares[i])); 
    cout<<"\nangle"<<minRect.angle; 
     cv::Point2f rect_points[4]; 
     minRect.points(rect_points); 
     for (int j = 0; j < 4; j++) { 
      cv::line(image, rect_points[j], rect_points[(j+1)%4], cv::Scalar(0,0,255), 3, 8); // blue 
     } 
    } 

    imshow(" Image", image); 
    return image; 
} 

`