Есть ли простой способ умножить размер и координаты cv::Rect?

Допустим, у меня есть 2 прямоугольника. Я хочу, чтобы второй прямоугольник был в два раза больше, чем первый прямоугольник, а положение x, y также в два раза больше.

cv::Rect r1=Rect(10,20,40,60);
cv::Rect r2 = r1 * 2;  //this won't work

Установка параметра прямоугольника 2 1 на 1 будет работать

r2.height = r1.height * 2;
r2.width = r1.height * 2;
r2.x = r1.x * 2;
r2.y = r2.y * 2;

Это работает, но есть ли более простой способ сделать это (например, однострочный код)?

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

George 08.04.2019 11:04

вы пробовали cv::Rect r2 = r1 * cv::Size(2,2); ? или cv::Rect r2 = r1 +cv::Size(width, height) для перевода, rect + cv::Point(x,y) должен работать.

Micka 08.04.2019 11:06

Вы собираетесь умножать позиции x,y что вы имеете в виду под умножением позиций? Для изменения размера вы можете умножить width, height.

Bahramdun Adil 08.04.2019 11:06

Умножение прямоугольника на два на самом деле не имеет ясного смысла; где должно быть происхождение? (0, 0)? Нижняя левая? Центр?

Ken Y-N 08.04.2019 11:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
816
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Мы можем перегрузить оператор *:

cv::Rect operator*(cv::Rect r, double scale) {
    r.height *= scale;
    r.width *= scale;
    r.x *= scale;
    r.y *= scale;
    return r;
}

И тогда вы можете напрямую умножать прямоугольники:

Rect r2 = Rect(10, 20, 40, 60) * 2;

Позиция умножения не имела смысла, поэтому OpenCV не обеспечивает такой перегрузки оператора. Позиция умножения не означает изменение размера, как просит OP.

Bahramdun Adil 08.04.2019 11:09

@BahramdunAdil По общему признанию, я не думаю, что что-то вроде оператора умножения - хорошая идея, поскольку такое умножение не является распространенным случаем. Но оператор говорит: «Первый прямоугольник и положение x, y также в два раза больше».

George 08.04.2019 11:32

@George Если вы проверите комментарии под вопросом ОП, вы увидите, что другие также думают, что неправильно изменять размер прямоугольника, умножая позицию, поэтому не только ОП ошибается в своем вопросе (поскольку он хочет изменить размер, не репозиция) но и ответ по этому тоже не имеет смысла. Изменение размера и изменение положения — это два разных понятия. Чего сразу не сделаешь.

Bahramdun Adil 08.04.2019 11:38

Это просто операция масштабирования. И когда вы масштабируете что-то, вы должны умножить и положение, и размер на один и тот же коэффициент.

Alecto Irene Perez 08.04.2019 11:39

@JorgePerez Тогда как насчет позиции 0,0? Или как насчет x=200 пока width=300 и когда вы умножите его на 2 сейчас x=400 он выйдет за рамки и выдаст исключение, но width все еще можно рисовать без исключения.

Bahramdun Adil 08.04.2019 11:44

Когда вы масштабируете фигуру — любую фигуру — вы рассматриваете точки вдоль фигуры как векторы и масштабируете их все с одним и тем же коэффициентом масштабирования. Это эквивалентно умножению положения, ширины и высоты на один и тот же коэффициент.

Alecto Irene Perez 08.04.2019 11:46

@BahramdunAdil Я хочу сказать, что в оп никогда не упоминается масштабирование или изменение размера. «Изменение размера и изменение положения — это два разных понятия». Кажется неуместным, учитывая информацию, которую мы получили.

George 08.04.2019 11:49

Он конкретно хочет умножить и размер, и координаты. Это именно то, что является масштабированием.

Alecto Irene Perez 08.04.2019 11:52

@George OP говорит: «Я хочу, чтобы второй прямоугольник был в два раза больше, чем первый прямоугольник, а положение x, y также в два раза больше», тогда как вы могли бы сделать положение в два раза больше? Если вы хотите увеличить позицию, то x станет меньше, например: позиция 100,100, когда вы сделаете ее больше, вы должны перейти к позиции 50, 50, или 0,0, поэтому x,y станет меньше, если вы умножите ее на 2, тогда она станет больше, что приведет к тому, что Rect станет меньше. Таким образом, масштабирование размера и положения является противоположной операцией.

Bahramdun Adil 08.04.2019 11:55

Чтобы увеличить позицию, вы умножаете ее на коэффициент масштабирования. Таким образом, чтобы сделать позицию вдвое больше, вы умножаете ее на 2. Если я визуализирую сразу несколько фигур, чтобы сделать их в два раза больше, я просто умножаю все позиции на 2 и все размеры на 2. Если я не t умножьте положение на 2, тогда ранее непересекающиеся фигуры могут перекрываться. Но при умножении все на 2 изображение, отображаемое на экране, становится в два раза больше.

Alecto Irene Perez 08.04.2019 11:58

@BahramdunAdil извините за поздний ответ и спасибо за обсуждение, позвольте мне исправить ситуацию, на самом деле у меня есть 2 кадра, 1 в два раза больше, чем первый. Итак, я хочу создать прямоугольник вдвое большего размера с той же пропорцией x, y (я просто не знаю, каков его официальный термин), я должен был упомянуть об этом в вопросе, извините.

gameon67 09.04.2019 02:06

Это известно как масштабирование, и решение, которое я дал, сделает именно это!

Alecto Irene Perez 09.04.2019 02:07

@JorgePerez В вашем решении x, y был изменен, OP хочет того же x, y, поэтому Rect переместится в новую позицию.

Bahramdun Adil 09.04.2019 03:17

OP буквально только что прокомментировал, что он хочет, чтобы x, y были пропорциональны размеру прямоугольника, потому что он увеличивает кадр! Вы должны масштабировать x и y, умножив их на коэффициент масштабирования.

Alecto Irene Perez 09.04.2019 03:18
Ответ принят как подходящий

Если вы хотите сделать это, это может быть кратчайший путь:

cv::Rect r1=Rect(10,20,40,60);
cv::Rect r2(r1.tl() * 2, r1.br() * 2);

Другие вопросы по теме