2016-03-08 2 views
3

Я написал следующий код:Является ли это ошибкой opencv RotatedRect?

#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 ЗР (-0,5, -1), а нижний правый угол RotatedRect ЗР (0.5,1) .so минимальный правый прямоугольник с поворотным прямоугольником равен [(-1, -1), (1,1)], (-1, -1) - верхний левый угол, (1,1) - нижний правый corner. Но нижний правый угол прямоугольника rect (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 на std :: vector и вычислите общее значение 'cv :: boundingRect' этих точек? Каков результат? – Micka

+0

cv :: boundingRect в порядке. RotatedRect :: boundingRect() может быть неправильным. – Gauss

ответ

1

Похоже, cv::boundingRect и RotatedRect::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; 
} 

Результат дает несколько иных ограничительные прямоугольники (RotatedRect :: boundingRect окружает точки в то время как резюме :: boundingRect находится на точках). Это может быть ошибкой, возможно, изначально cv :: RotatedRect :: boundingRect была оптимизированной копией cv :: boundingRect, а исправление в cv :: boundingRect не обновляло функцию-член. Не уверен ... Я бы рекомендовал использовать общую цель cv :: boundingRect все время (не измеряя скорость, хотя).

enter image description here

+0

Я попробовал на моем компьютере как 'RotatedRect :: boundingRect', так и' cv :: boundingRect'. Однако выход был одинаков. Они оба окружили очки. – Galaxy

+0

@ галактика, какая версия opencv? шахта была 2.4.9 или 2.4.11 – Micka

+0

Шахта была 2.4.11. – Galaxy

Смежные вопросы