Перейти к содержимому
Compvision.ru
RinOS

Как нарисовать CvBox2D

Recommended Posts

Всем привет! Подскажите пожалуйста как нарисовать CvBox2D?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Всем привет! Подскажите пожалуйста как нарисовать CvBox2D?

Вообще то это структура

typdef struct {

CvPoint2D32f center;

CvSize2D32f size;

float angle;

} CvBox2D;

Или я что-то пропустил?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да структура) Она представляет собой прямоугольник, повернутый на определенный угол.

Вот этот прямоугольник и нужно как то нарисовать..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Да структура) Она представляет собой прямоугольник, повернутый на определенный угол.

Вот этот прямоугольник и нужно как то нарисовать..

Берем координаты углов относительно центра прямоугольника в неповернутом, несмещенном состоянии.

Поворачиваем относительно центра, и затем смещаем.

for (int i=0;i<4;i++)

{

x1=x0*cos(phi)+y0*sin(phi)+dx;

y1=-x0*sin(phi)+y0*cos(phi)+dx;

}

// sin и cos можно (лучше) посчитать заранее

// phi - угол поворота (радианы), dx, dy - смещение

// x0,y0 - координаты углов относительно центра прямоугольника

// x0,y0 - координаты повернутой и смещенной угловой точки

// дальше рисуем линиями

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

хм... что то не понял( видимо этот код подходит для CvRect, но у CvBox2D немного другая структура...

box2D.center.x, box2D.center.y

Я так понимаю что x,y задают центр прямугольника, а не верхний левый угол.

В общем вот функция, может кому тоже пригодится :)

void PaintBox2D(IplImage* img, CvBox2D box, CvScalar color,

int thickness CV_DEFAULT(1), int line_type CV_DEFAULT(8),

int shift CV_DEFAULT(0))

{

CvPoint2D32f box_vtx[4];

cvBoxPoints(box, box_vtx);

CvPoint pt0, pt;

pt0.x = cvRound(box_vtx[3].x);

pt0.y = cvRound(box_vtx[3].y);

for(int i = 0; i < 4; i++ )

{

pt.x = cvRound(box_vtx.x);

pt.y = cvRound(box_vtx.y);

cvLine(img, pt0, pt, color, thickness, line_type, shift);

pt0 = pt;

}

}

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
хм... что то не понял( видимо этот код подходит для CvRect, но у CvBox2D немного другая структура...

Я так понимаю что x,y задают центр прямугольника, а не верхний левый угол.

В общем вот функция, может кому тоже пригодится :)

void PaintBox2D(IplImage* img, CvBox2D box, CvScalar color,

int thickness CV_DEFAULT(1), int line_type CV_DEFAULT(8),

int shift CV_DEFAULT(0))

{

CvPoint2D32f box_vtx[4];

cvBoxPoints(box, box_vtx);

CvPoint pt0, pt;

pt0.x = cvRound(box_vtx[3].x);

pt0.y = cvRound(box_vtx[3].y);

for(int i = 0; i < 4; i++ )

{

pt.x = cvRound(box_vtx.x);

pt.y = cvRound(box_vtx.y);

cvLine(img, pt0, pt, color, thickness, line_type, shift);

pt0 = pt;

}

}

Спасибо, эту весьма удобную ф-цию сразу не заметил.

cvBoxPoints определена так:

void cvBoxPoints( CvBox2D box, CvPoint2D32f pt[4] )

{

float a = (float)cos(box.angle)*0.5f;

float b = (float)sin(box.angle)*0.5f;

pt[0].x = box.center.x - a*box.size.height - b*box.size.width;

pt[0].y = box.center.y + b*box.size.height - a*box.size.width;

pt[1].x = box.center.x + a*box.size.height - b*box.size.width;

pt[1].y = box.center.y - b*box.size.height - a*box.size.width;

pt[2].x = 2*box.center.x - pt[0].x;

pt[2].y = 2*box.center.y - pt[0].y;

pt[3].x = 2*box.center.x - pt[1].x;

pt[3].y = 2*box.center.y - pt[1].y;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо, отличная функция! Как раз то, что искал! :D

Однако вместо цикла с выводом линий for(int i = 0; i < 4; i++ ) я, пожалуй, присандалю вывод полигона :lol:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×