Допустим, у меня есть 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;
Это работает, но есть ли более простой способ сделать это (например, однострочный код)?
вы пробовали cv::Rect r2 = r1 * cv::Size(2,2); ? или cv::Rect r2 = r1 +cv::Size(width, height) для перевода, rect + cv::Point(x,y) должен работать.
Вы собираетесь умножать позиции x,y
что вы имеете в виду под умножением позиций? Для изменения размера вы можете умножить width, height
.
Умножение прямоугольника на два на самом деле не имеет ясного смысла; где должно быть происхождение? (0, 0)? Нижняя левая? Центр?
Мы можем перегрузить оператор *
:
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.
@BahramdunAdil По общему признанию, я не думаю, что что-то вроде оператора умножения - хорошая идея, поскольку такое умножение не является распространенным случаем. Но оператор говорит: «Первый прямоугольник и положение x, y также в два раза больше».
@George Если вы проверите комментарии под вопросом ОП, вы увидите, что другие также думают, что неправильно изменять размер прямоугольника, умножая позицию, поэтому не только ОП ошибается в своем вопросе (поскольку он хочет изменить размер, не репозиция) но и ответ по этому тоже не имеет смысла. Изменение размера и изменение положения — это два разных понятия. Чего сразу не сделаешь.
Это просто операция масштабирования. И когда вы масштабируете что-то, вы должны умножить и положение, и размер на один и тот же коэффициент.
@JorgePerez Тогда как насчет позиции 0,0
? Или как насчет x=200
пока width=300
и когда вы умножите его на 2
сейчас x=400
он выйдет за рамки и выдаст исключение, но width
все еще можно рисовать без исключения.
Когда вы масштабируете фигуру — любую фигуру — вы рассматриваете точки вдоль фигуры как векторы и масштабируете их все с одним и тем же коэффициентом масштабирования. Это эквивалентно умножению положения, ширины и высоты на один и тот же коэффициент.
@BahramdunAdil Я хочу сказать, что в оп никогда не упоминается масштабирование или изменение размера. «Изменение размера и изменение положения — это два разных понятия». Кажется неуместным, учитывая информацию, которую мы получили.
Он конкретно хочет умножить и размер, и координаты. Это именно то, что является масштабированием.
@George OP говорит: «Я хочу, чтобы второй прямоугольник был в два раза больше, чем первый прямоугольник, а положение x, y также в два раза больше», тогда как вы могли бы сделать положение в два раза больше? Если вы хотите увеличить позицию, то x
станет меньше, например: позиция 100,100
, когда вы сделаете ее больше, вы должны перейти к позиции 50, 50
, или 0,0
, поэтому x,y
станет меньше, если вы умножите ее на 2, тогда она станет больше, что приведет к тому, что Rect станет меньше. Таким образом, масштабирование размера и положения является противоположной операцией.
Чтобы увеличить позицию, вы умножаете ее на коэффициент масштабирования. Таким образом, чтобы сделать позицию вдвое больше, вы умножаете ее на 2. Если я визуализирую сразу несколько фигур, чтобы сделать их в два раза больше, я просто умножаю все позиции на 2 и все размеры на 2. Если я не t умножьте положение на 2, тогда ранее непересекающиеся фигуры могут перекрываться. Но при умножении все на 2 изображение, отображаемое на экране, становится в два раза больше.
@BahramdunAdil извините за поздний ответ и спасибо за обсуждение, позвольте мне исправить ситуацию, на самом деле у меня есть 2 кадра, 1 в два раза больше, чем первый. Итак, я хочу создать прямоугольник вдвое большего размера с той же пропорцией x, y (я просто не знаю, каков его официальный термин), я должен был упомянуть об этом в вопросе, извините.
Это известно как масштабирование, и решение, которое я дал, сделает именно это!
@JorgePerez В вашем решении x, y
был изменен, OP хочет того же x, y
, поэтому Rect переместится в новую позицию.
OP буквально только что прокомментировал, что он хочет, чтобы x, y были пропорциональны размеру прямоугольника, потому что он увеличивает кадр! Вы должны масштабировать x и y, умножив их на коэффициент масштабирования.
Если вы хотите сделать это, это может быть кратчайший путь:
cv::Rect r1=Rect(10,20,40,60);
cv::Rect r2(r1.tl() * 2, r1.br() * 2);
Не в соответствии с документы, вы могли бы написать свою собственную функцию, но она кажется относительно специализированной, поскольку вы умножаете позицию?