You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

285 lines
8.9 KiB

/** @file */
/* The MIT License
*
* Copyright (c) 2008, Naotoshi Seo <sonots(at)sonots.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef CV_RECT32F_INCLUDED
#define CV_RECT32F_INCLUDED
#include "cv.h"
#include "cvaux.h"
#include "cxcore.h"
/************************* Structure Definitions ******************************/
/**
* Floating Rectangle Structure
*/
typedef struct CvRect32f {
float x; /**< left x coord of rectangle */
float y; /**< top y coord of rectangle */
float width; /**< width of rectangle */
float height; /**< height of rectangle */
float angle; /**< counter-clockwise rotation angle in degree
rotation center is (x, y) coordinates */
} CvRect32f;
/**
* Center Coordinate Floating Rectangle Structure
*
* This is equivalent with CvBox2D, but I wanted this structure because
* CvBox2D's parameters are too long such as box.center.x, box.size.width and
* CvBox2D does not have a constructor cvBox2D(...).
*/
typedef struct CvBox32f {
float cx; /**< center x coord of rectangle */
float cy; /**< center y coord of center of rectangle */
float width; /**< width of rectangle */
float height; /**< height of rectangle */
float angle; /**< counter-clockwise rotation angle in degree
rotation center is center of rectangle */
} CvBox32f;
/***************************** Prototypes *************************************/
//CV_INLINE CvRect32f cvRect32f( float x, float y, float width, float height,
// float angle = 0.0 );
//CV_INLINE CvBox32f cvBox32f( float cx, float cy, float width, float height,
// float angle = 0.0 );
//CVAPI(CvBox32f) cvBox32fFromRect32f( CvRect32f rect );
//CVAPI(CvRect32f) cvRect32fFromBox32f( CvBox32f box );
//CV_INLINE CvRect32f cvRect32fFromRect( CvRect rect, float angle = 0 );
//CV_INLINE CvRect cvRectFromRect32f( CvRect32f rect );
//CV_INLINE CvBox32f cvBox32fFromBox2D( CvBox2D box );
//CV_INLINE CvBox2D cvBox2DFromBox32f( CvBox32f box );
//CV_INLINE CvBox32f cvBox32fFromRect( CvRect rect );
//CV_INLINE CvRect cvRectFromBox32f( CvBox32f box );
//CV_INLINE CvRect cvRectFromBox2D( CvBox2D box );
//CV_INLINE CvBox2D cvBox2DFromRect32f( CvRect32f rect );
//CV_INLINE CvRect32f cvRect32fFromBox2D( CvBox2D box );
// CV_INLINE void cvPrintRect32f( CvRect32f rect );
// CV_INLINE void cvPrintBox32f( CvBox32f box );
// CV_INLINE void cvPrintBox2D( CvBox2D box );
// CV_INLINE void cvPrintRect( CvRect rect );
/******************************* Constructor **********************************/
/**
* The Constructor of Floating Rectangle Structure
*
* @param x left x coord of rectangle
* @param y top y coord of center of rectangle
* @param width width of rectangle
* @param height height of rectangle
* @param angle counter-clockwise rotation angle in degree
* rotation center is (x, y) coordinates
*/
CV_INLINE CvRect32f cvRect32f( float x, float y, float width, float height,
float angle CV_DEFAULT(0.0) )
{
CvRect32f rect = { x, y, width, height, angle };
return rect;
}
/**
* The Constructor of Center Coordinate Floating Rectangle Structure
*
* @param cx center x coord of rectangle
* @param cy center y coord of center of rectangle
* @param width width of rectangle
* @param height height of rectangle
* @param angle counter-clockwise rotation angle in degree
* rotation center is center of rectangle
*/
CV_INLINE CvBox32f cvBox32f( float cx, float cy, float width, float height,
float angle CV_DEFAULT(0.0) )
{
CvBox32f box = { cx, cy, width, height, angle };
return box;
}
/****************************** Converter *************************************/
/**
*cvRect32f from cvRect
*/
CV_INLINE CvRect32f cvRect32fFromRect( CvRect rect, float angle CV_DEFAULT(0.0) )
{
return cvRect32f( rect.x, rect.y, rect.width, rect.height, angle );
}
/**
* cvRect from cvRect32f
*/
CV_INLINE CvRect cvRectFromRect32f( CvRect32f rect )
{
return cvRect( cvRound( rect.x ), cvRound( rect.y ),
cvRound( rect.width ), cvRound( rect.height ) );
}
/**
* cvBox32f from cvBox2D
*/
CV_INLINE CvBox32f cvBox32fFromBox2D( CvBox2D box )
{
return cvBox32f( box.center.x, box.center.y,
box.size.width, box.size.height,
box.angle );
}
/**
* cvBox2D from cvBox32f
*/
CV_INLINE CvBox2D cvBox2DFromBox32f( CvBox32f box )
{
CvBox2D box2d;
box2d.center.x = box.cx;
box2d.center.y = box.cy;
box2d.size.width = box.width;
box2d.size.height = box.height;
box2d.angle = box.angle;
return box2d;
}
/**
* cvBox32f from cvRect32f
*
* Convert upper-left coordinate to center coordinate of the rectangle
*/
CvBox32f cvBox32fFromRect32f( CvRect32f rect )
{
CvPoint2D32f c;
// x + ( x + width - 1 ) / 2 = cx
c.x = ( 2 * rect.x + rect.width - 1 ) / 2.0;
c.y = ( 2 * rect.y + rect.height - 1 ) / 2.0;
if( rect.angle != 0 )
{
CvMat* R = cvCreateMat( 2, 3, CV_32FC1 );
cv2DRotationMatrix( cvPoint2D32f( rect.x, rect.y ), rect.angle, 1.0, R );
c = cvPoint2D32f (
cvmGet( R, 0, 0 ) * c.x + cvmGet( R, 0, 1 ) * c.y + cvmGet( R, 0, 2 ),
cvmGet( R, 1, 0 ) * c.x + cvmGet( R, 1, 1 ) * c.y + cvmGet( R, 1, 2 ) );
cvReleaseMat( &R );
}
return cvBox32f( c.x, c.y, rect.width, rect.height, rect.angle );
}
/**
* cvRect32f from cvBox32f
*
* Convert center coordinate to upper-left coordinate of the rectangle
*/
CvRect32f cvRect32fFromBox32f( CvBox32f box )
{
CvPoint2D32f l;
// x + ( x + width - 1 ) / 2 = cx
l.x = ( 2 * box.cx + 1 - box.width ) / 2.0;
l.y = ( 2 * box.cy + 1 - box.height ) / 2.0;
if( box.angle != 0.0 )
{
CvMat* R = cvCreateMat( 2, 3, CV_32FC1 );
cv2DRotationMatrix( cvPoint2D32f( box.cx, box.cy ), box.angle, 1.0, R );
l = cvPoint2D32f (
cvmGet( R, 0, 0 ) * l.x + cvmGet( R, 0, 1 ) * l.y + cvmGet( R, 0, 2 ),
cvmGet( R, 1, 0 ) * l.x + cvmGet( R, 1, 1 ) * l.y + cvmGet( R, 1, 2 ) );
cvReleaseMat( &R );
}
return cvRect32f( l.x, l.y, box.width, box.height, box.angle );
}
/**
* CvBox32f from CvRect
*/
CV_INLINE CvBox32f cvBox32fFromRect( CvRect rect )
{
return cvBox32fFromRect32f( cvRect32fFromRect( rect ) );
}
/**
* CvRect from CvBox32f
*/
CV_INLINE CvRect cvRectFromBox32f( CvBox32f box )
{
return cvRectFromRect32f( cvRect32fFromBox32f( box ) );
}
/**
* CvRect from CvBox2D
*/
CV_INLINE CvRect cvRectFromBox2D( CvBox2D box )
{
return cvRectFromBox32f( cvBox32fFromBox2D( box ) );
}
/**
* CvBox2D from CvRect32f
*/
CV_INLINE CvBox2D cvBox2DFromRect32f( CvRect32f rect )
{
return cvBox2DFromBox32f( cvBox32fFromRect32f( rect ) );
}
/**
* CvRect32f from CvBox2D
*/
CV_INLINE CvRect32f cvRect32fFromBox2D( CvBox2D box )
{
return cvRect32fFromBox32f( cvBox32fFromBox2D( box ) );
}
/************************************ Print ***********************************/
/**
* Print CvRect32f
*/
CV_INLINE void cvPrintRect32f( CvRect32f rect )
{
printf( "x=%f y=%f width=%f height=%f angle=%f\n",
rect.x, rect.y, rect.width, rect.height, rect.angle );
fflush( stdout );
}
/**
* Print CvBox32f
*/
CV_INLINE void cvPrintBox32f( CvBox32f box )
{
printf( "cx=%f cy=%f width=%f height=%f angle=%f\n",
box.cx, box.cy, box.width, box.height, box.angle );
fflush( stdout );
}
/**
* Print CvBox2D
*/
CV_INLINE void cvPrintBox2D( CvBox2D box )
{
printf( "cx=%f cy=%f width=%f height=%f angle=%f\n",
box.center.x, box.center.y, box.size.width,
box.size.height, box.angle );
fflush( stdout );
}
/**
* Print CvRect
*/
CV_INLINE void cvPrintRect( CvRect rect )
{
printf( "x=%d y=%d width=%d height=%d",
rect.x, rect.y, rect.width, rect.height );
fflush( stdout );
}
#endif