RinOS 16 Жалоба Опубликовано August 25, 2009 Всем привет! Подскажите пожалуйста как нарисовать CvBox2D? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Vicul 0 Жалоба Опубликовано August 25, 2009 Всем привет! Подскажите пожалуйста как нарисовать CvBox2D? Вообще то это структура typdef struct { CvPoint2D32f center; CvSize2D32f size; float angle; } CvBox2D; Или я что-то пропустил? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
RinOS 16 Жалоба Опубликовано August 26, 2009 Да структура) Она представляет собой прямоугольник, повернутый на определенный угол. Вот этот прямоугольник и нужно как то нарисовать.. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 26, 2009 Да структура) Она представляет собой прямоугольник, повернутый на определенный угол. Вот этот прямоугольник и нужно как то нарисовать.. Берем координаты углов относительно центра прямоугольника в неповернутом, несмещенном состоянии. Поворачиваем относительно центра, и затем смещаем. 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 - координаты повернутой и смещенной угловой точки // дальше рисуем линиями Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
RinOS 16 Жалоба Опубликовано August 27, 2009 хм... что то не понял( видимо этот код подходит для 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; } } 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 28, 2009 хм... что то не понял( видимо этот код подходит для 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; } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
FingerScan 0 Жалоба Опубликовано September 5, 2010 Спасибо, отличная функция! Как раз то, что искал! Однако вместо цикла с выводом линий for(int i = 0; i < 4; i++ ) я, пожалуй, присандалю вывод полигона Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах