2016-03-08 77 views
3

我写了下面的代码:它是一个opencv RotatedRect的bug吗?

#include<iostream> 
#include<opencv2/core/core.hpp> 
using namespace std; 
using namespace cv; 

int main() 
{ 
    Point2f p[4]; 
    RotatedRect rr(Point2f(),Size2f(1,2),0); 
    rr.points(p); 
    for(int i = 0;i < 4;i++) cout<<p[i]<<endl; 
    Rect r = rr.boundingRect(); 
    cout<< r.x << " " << r.y << " " << r.br().x << " " << r.br().y <<endl; 
    return 0; 
} 

RotatedRect RR的左上角为(-0.5,-1),RotatedRect RR的右下角为(0.5,1)。所以包含旋转矩形的最小右上矩形是[(-1,-1),(1,1)],( - 1,-1)是左上角,(1,1)是右下角但是结果矩形的右下角是(2,2)。

和我读到来源:

Rect RotatedRect::boundingRect() const 
{ 
    Point2f pt[4]; 
    points(pt); 
    Rect r(cvFloor(std::min(std::min(std::min(pt[0].x, pt[1].x), pt[2].x), pt[3].x)), 
      cvFloor(std::min(std::min(std::min(pt[0].y, pt[1].y), pt[2].y), pt[3].y)), 
      cvCeil(std::max(std::max(std::max(pt[0].x, pt[1].x), pt[2].x), pt[3].x)), 
      cvCeil(std::max(std::max(std::max(pt[0].y, pt[1].y), pt[2].y), pt[3].y))); 
    r.width -= r.x - 1; 
    r.height -= r.y - 1; 
    return r; 
} 

我不知道该代码r.width -= r.x - 1;r.height -= r.y - 1; 我认为这应该是r.width -= r.x;r.height -= r.y; 谁能告诉我它是源错了吗?

+0

所以RotatedRect本身就没问题?如果您将RotatedRect角点推回到std :: vector并计算这些点的通用'cv :: boundingRect',该怎么办?那是什么结果? – Micka

+0

cv :: boundingRect是可以的。 RotatedRect :: boundingRect()可能是错误的。 – Gauss

回答

1

看起来像cv::boundingRectRotatedRect::boundingRect不一致。我用这个小测试应用程序

int main(int argc, char* argv[]) 
{ 
    cv::Mat input = cv::imread("C:/StackOverflow/Input/Lenna.png"); 

    //cv::RotatedRect rr = cv::RotatedRect(cv::Point2f(), cv::Size2f(1, 2), 0); 

    cv::RotatedRect rr = cv::RotatedRect(cv::Point2f(256,256), cv::Size2f(150, 100), 45); 

    cv::Rect rect1 = rr.boundingRect(); 

    cv::Point2f pt[4]; 
    rr.points(pt); 

    std::vector<cv::Point> pts; 
    pts.push_back(pt[0]); 
    pts.push_back(pt[1]); 
    pts.push_back(pt[2]); 
    pts.push_back(pt[3]); 

    cv::Rect rect2 = cv::boundingRect(pts); 

    std::cout << "RotatedRect::boundingRect: " << rect1 << std::endl; 
    std::cout << "cv::boundingRect: " << rect2 << std::endl; 

    cv::line(input, pt[0], pt[1], cv::Scalar(0, 0, 255)); 
    cv::line(input, pt[1], pt[2], cv::Scalar(0, 0, 255)); 
    cv::line(input, pt[2], pt[3], cv::Scalar(0, 0, 255)); 
    cv::line(input, pt[3], pt[0], cv::Scalar(0, 0, 255)); 

    cv::rectangle(input, rect1, cv::Scalar(255, 0, 0)); 
    cv::rectangle(input, rect2, cv::Scalar(0, 255, 0)); 

    cv::imshow("input", input); 
    cv::waitKey(0); 
    return 0; 
} 

结果给出稍微不同的边界rects(RotatedRect :: boundingRect围绕点,而CV :: boundingRect被放置在点)。这可能确实是一个错误,也许最初cv :: RotatedRect :: boundingRect是cv :: boundingRect的优化副本,并且cv :: boundingRect中的错误修正没有更新成员函数。不知道...我会建议一直使用通用cv :: boundingRect(虽然没有测量速度)。

enter image description here

+0

我在我的电脑上试了'RotatedRect :: boundingRect'和'cv :: boundingRect'。但是,产量是相同的。他们都围绕着这些观点。 – Galaxy

+0

@galaxy哪个opencv版本?矿是2.4.9或2.4.11 – Micka

+0

矿是2.4.11。 – Galaxy