Округление Rect2f в Rect2i, согласованное с подразделением OpenCV - PullRequest
0 голосов
/ 16 июня 2020

В OpenCV при создании cv :: Rect2i из cv :: Rect2f библиотека просто округляет каждый компонент cv :: Rect2f, то есть x, y, ширину, высоту. Это вызывает дыры и наложения при преобразовании набора прямоугольников подразделения, например, интервалы 0,4..1,6 и 1,6..3,2 будут округлены до 0..1 и 2..4, в то время как желаемое целочисленное подразделение будет 0 .. 2 и 2..3, т.е. каждый подынтервал включает в себя те целые пиксели, центры которых l ie с соответствующим интервалом с плавающей запятой.

Теперь я использую следующую функцию «велосипед» для решения задачи:

cv::Rect2i integer_rect(const cv::Rect2f & rect)
{
    int x1 = std::floor(rect.x + 0.5f);
    int y1 = std::floor(rect.y + 0.5f);
    int x2 = std::floor(rect.x + rect.width + 0.5f);
    int y2 = std::floor(rect.y + rect.height + 0.5f);
    return cv::Rect2i(x1, y1, x2 - x1, y2 - y1);
}

Содержит ли OpenCV уже такую ​​функцию преобразования, которую я мог бы пропустить?

1 Ответ

0 голосов
/ 17 июня 2020

Вы можете использовать как rect3.

cv::Rect2f rect1(0.4, 1.4, 1.6, 3.2);
cv::Rect2i rect2 = rect1;
cv::Rect2i rect3(rect1.tl(), rect1.br()); // tl for top-left and br for bottom-right

cout << rect1 << endl;
cout << rect2 << endl;
cout << rect3 << endl;

выходы

[1.6 x 3.2 from (0.4, 1.4)]
[2 x 3 from (0, 1)]
[2 x 4 from (0, 1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...