📄 cxdrawing.c
字号:
scalar.val[2] = (icolor >> 16) & 255;
scalar.val[3] = (icolor >> 24) & 255;
}
else
{
scalar.val[0] = CV_CAST_8U( icolor );
scalar.val[1] = scalar.val[2] = scalar.val[3] = 0;
}
}
else if( CV_MAT_DEPTH( type ) == CV_8S )
{
int icolor = cvRound( packed_color );
if( CV_MAT_CN( type ) > 1 )
{
scalar.val[0] = (char)icolor;
scalar.val[1] = (char)(icolor >> 8);
scalar.val[2] = (char)(icolor >> 16);
scalar.val[3] = (char)(icolor >> 24);
}
else
{
scalar.val[0] = CV_CAST_8S( icolor );
scalar.val[1] = scalar.val[2] = scalar.val[3] = 0;
}
}
else
{
int cn = CV_MAT_CN( type );
switch( cn )
{
case 1:
scalar.val[0] = packed_color;
scalar.val[1] = scalar.val[2] = scalar.val[3] = 0;
break;
case 2:
scalar.val[0] = scalar.val[1] = packed_color;
scalar.val[2] = scalar.val[3] = 0;
break;
case 3:
scalar.val[0] = scalar.val[1] = scalar.val[2] = packed_color;
scalar.val[3] = 0;
break;
default:
scalar.val[0] = scalar.val[1] =
scalar.val[2] = scalar.val[3] = packed_color;
break;
}
}
return scalar;
}
CV_IMPL void
cvLine( void* img, CvPoint pt1, CvPoint pt2, CvScalar color,
int thickness, int line_type, int shift )
{
CV_FUNCNAME( "cvLine" );
__BEGIN__
int coi = 0;
CvMat stub, *mat = (CvMat*)img;
double buf[4];
CV_CALL( mat = cvGetMat( img, &stub, &coi, 0 ));
if( line_type == CV_AA && CV_MAT_DEPTH(mat->type) != CV_8U )
line_type = 8;
if( coi != 0 )
CV_ERROR( CV_BadCOI, cvUnsupportedFormat );
if( (unsigned)thickness > 255 )
CV_ERROR( CV_StsOutOfRange, "" );
if( shift < 0 || XY_SHIFT < shift )
CV_ERROR( CV_StsOutOfRange, "shift must be between 0 and 16" );
CV_CALL( cvScalarToRawData( &color, buf, mat->type, 0 ));
icvThickLine( mat, pt1, pt2, buf, thickness, line_type, 3, shift );
__END__;
}
CV_IMPL void
cvRectangle( void* img, CvPoint pt1, CvPoint pt2,
CvScalar color, int thickness,
int line_type, int shift )
{
CvPoint pt[4];
CV_FUNCNAME("cvRectangle");
__BEGIN__
int coi = 0;
CvMat stub, *mat = (CvMat*)img;
double buf[4];
if( thickness < -1 || thickness > 255 )
CV_ERROR( CV_StsOutOfRange, "" );
CV_CALL( mat = cvGetMat( img, &stub, &coi, 0 ));
if( line_type == CV_AA && CV_MAT_DEPTH(mat->type) != CV_8U )
line_type = 8;
if( coi != 0 )
CV_ERROR( CV_BadCOI, cvUnsupportedFormat );
if( shift < 0 || XY_SHIFT < shift )
CV_ERROR( CV_StsOutOfRange, "shift must be between 0 and 16" );
CV_CALL( cvScalarToRawData( &color, buf, mat->type, 0 ));
pt[0] = pt1;
pt[1].x = pt2.x;
pt[1].y = pt1.y;
pt[2] = pt2;
pt[3].x = pt1.x;
pt[3].y = pt2.y;
if( thickness >= 0 )
icvPolyLine( mat, pt, 4, 1, buf, thickness, line_type, shift );
else
icvFillConvexPoly( mat, pt, 4, buf, line_type, shift );
__END__;
}
CV_IMPL void
cvCircle( void *img, CvPoint center, int radius,
CvScalar color, int thickness, int line_type, int shift )
{
CV_FUNCNAME( "cvCircle" );
__BEGIN__
int coi = 0;
CvMat stub, *mat = (CvMat*)img;
double buf[4];
CV_CALL( mat = cvGetMat( mat, &stub, &coi, 0 ));
if( line_type == CV_AA && CV_MAT_DEPTH(mat->type) != CV_8U )
line_type = 8;
if( coi != 0 )
CV_ERROR( CV_BadCOI, cvUnsupportedFormat );
if( radius < 0 )
CV_ERROR( CV_StsOutOfRange, "" );
if( thickness < -1 || thickness > 255 )
CV_ERROR( CV_StsOutOfRange, "" );
if( shift < 0 || XY_SHIFT < shift )
CV_ERROR( CV_StsOutOfRange, "shift must be between 0 and 16" );
CV_CALL( cvScalarToRawData( &color, buf, mat->type, 0 ));
if( thickness > 1 || line_type >= CV_AA )
{
center.x <<= XY_SHIFT - shift;
center.y <<= XY_SHIFT - shift;
radius <<= XY_SHIFT - shift;
icvEllipseEx( mat, center, cvSize( radius, radius ),
0, 0, 360, buf, thickness, line_type );
}
else
{
icvCircle( mat, center, radius, buf, thickness < 0 );
}
__END__;
}
CV_IMPL void
cvEllipse( void *img, CvPoint center, CvSize axes,
double angle, double start_angle, double end_angle,
CvScalar color, int thickness, int line_type, int shift )
{
CV_FUNCNAME( "cvEllipse" );
__BEGIN__
int coi = 0;
CvMat stub, *mat = (CvMat*)img;
double buf[4];
CV_CALL( mat = cvGetMat( mat, &stub, &coi, 0 ));
if( line_type == CV_AA && CV_MAT_DEPTH(mat->type) != CV_8U )
line_type = 8;
if( coi != 0 )
CV_ERROR( CV_BadCOI, cvUnsupportedFormat );
if( axes.width < 0 || axes.height < 0 )
CV_ERROR( CV_StsOutOfRange, "" );
if( thickness < -1 || thickness > 255 )
CV_ERROR( CV_StsOutOfRange, "" );
if( shift < 0 || XY_SHIFT < shift )
CV_ERROR( CV_StsOutOfRange, "shift must be between 0 and 16" );
CV_CALL( cvScalarToRawData( &color, buf, mat->type, 0 ));
{
int _angle = cvRound(angle);
int _start_angle = cvRound(start_angle);
int _end_angle = cvRound(end_angle);
center.x <<= XY_SHIFT - shift;
center.y <<= XY_SHIFT - shift;
axes.width <<= XY_SHIFT - shift;
axes.height <<= XY_SHIFT - shift;
CV_CALL( icvEllipseEx( mat, center, axes, _angle, _start_angle,
_end_angle, buf, thickness, line_type ));
}
__END__;
}
CV_IMPL void
cvFillConvexPoly( void *img, CvPoint *pts, int npts, CvScalar color, int line_type, int shift )
{
CV_FUNCNAME( "cvFillConvexPoly" );
__BEGIN__
int coi = 0;
CvMat stub, *mat = (CvMat*)img;
double buf[4];
CV_CALL( mat = cvGetMat( mat, &stub, &coi, 0 ));
if( line_type == CV_AA && CV_MAT_DEPTH(mat->type) != CV_8U )
line_type = 8;
if( coi != 0 )
CV_ERROR( CV_BadCOI, cvUnsupportedFormat );
if( !pts )
CV_ERROR( CV_StsNullPtr, "" );
if( npts <= 0 )
CV_ERROR( CV_StsOutOfRange, "" );
if( shift < 0 || XY_SHIFT < shift )
CV_ERROR( CV_StsOutOfRange, "shift must be between 0 and 16" );
CV_CALL( cvScalarToRawData( &color, buf, mat->type, 0 ));
icvFillConvexPoly( mat, pts, npts, buf, line_type, shift );
__END__;
}
CV_IMPL void
cvFillPoly( void *img, CvPoint **pts, int *npts, int contours,
CvScalar color, int line_type, int shift )
{
CvMemStorage* st = 0;
CV_FUNCNAME( "cvFillPoly" );
__BEGIN__
int coi = 0;
CvMat stub, *mat = (CvMat*)img;
double buf[4];
CV_CALL( mat = cvGetMat( mat, &stub, &coi, 0 ));
if( line_type == CV_AA && CV_MAT_DEPTH(mat->type) != CV_8U )
line_type = 8;
if( coi != 0 )
CV_ERROR( CV_BadCOI, cvUnsupportedFormat );
if( contours <= 0 )
CV_ERROR( CV_StsBadArg, "" );
if( !pts )
CV_ERROR( CV_StsNullPtr, "" );
if( npts <= 0 )
CV_ERROR( CV_StsNullPtr, "" );
if( shift < 0 || XY_SHIFT < shift )
CV_ERROR( CV_StsOutOfRange, "shift must be between 0 and 16" );
CV_CALL( cvScalarToRawData( &color, buf, mat->type, 0 ));
{
CvContour* edges = 0;
CvSeq vtx;
CvSeqBlock block;
int i;
CV_CALL( st = cvCreateMemStorage( CV_DRAWING_STORAGE_BLOCK ));
CV_CALL( edges = (CvContour*)cvCreateSeq( 0, sizeof(CvContour),
sizeof(CvPolyEdge), st ));
for( i = 0; i < contours; i++ )
{
if( !pts[i] )
CV_ERROR( CV_StsNullPtr, "" );
if( npts[i] < 0 )
CV_ERROR( CV_StsOutOfRange, "" );
cvMakeSeqHeaderForArray( CV_32SC2, sizeof(CvSeq), sizeof(CvPoint),
pts[i], npts[i], &vtx, &block );
CV_CALL( icvCollectPolyEdges( mat, &vtx, edges, buf, line_type, shift, cvPoint(0,0) ));
}
CV_CALL( icvFillEdgeCollection( mat, edges, buf ));
}
__END__;
cvReleaseMemStorage( &st );
}
CV_IMPL void
cvPolyLine( void *img, CvPoint **pts, int *npts,
int contours, int closed, CvScalar color,
int thickness, int line_type, int shift )
{
CV_FUNCNAME( "cvPolyLine" );
__BEGIN__
int coi = 0, i;
CvMat stub, *mat = (CvMat*)img;
double buf[4];
CV_CALL( mat = cvGetMat( mat, &stub, &coi, 0 ));
if( line_type == CV_AA && CV_MAT_DEPTH(mat->type) != CV_8U )
line_type = 8;
if( coi != 0 )
CV_ERROR( CV_BadCOI, cvUnsupportedFormat );
if( contours <= 0 )
CV_ERROR( CV_StsBadArg, "" );
if( thickness < -1 || thickness > 255 )
CV_ERROR( CV_StsBadArg, "" );
if( !pts )
CV_ERROR( CV_StsNullPtr, "" );
if( npts <= 0 )
CV_ERROR( CV_StsNullPtr, "" );
if( shift < 0 || XY_SHIFT < shift )
CV_ERROR( CV_StsOutOfRange, "shift must be between 0 and 16" );
CV_CALL( cvScalarToRawData( &color, buf, mat->type, 0 ));
for( i = 0; i < contours; i++ )
icvPolyLine( mat, pts[i], npts[i], closed, buf, thickness, line_type, shift );
__END__;
}
#define CV_FONT_SIZE_SHIFT 8
#define CV_FONT_ITALIC_ALPHA (1 << 8)
#define CV_FONT_ITALIC_DIGIT (2 << 8)
#define CV_FONT_ITALIC_PUNCT (4 << 8)
#define CV_FONT_ITALIC_BRACES (8 << 8)
#define CV_FONT_HAVE_GREEK (16 << 8)
#define CV_FONT_HAVE_CYRILLIC (32 << 8)
static const int icvHersheyPlain[] = {
(5 + 4*16) + CV_FONT_HAVE_GREEK,
199, 214, 217, 233, 219, 197, 234, 216, 221, 222, 228, 225, 211, 224, 210, 220,
200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 212, 213, 191, 226, 192,
215, 190, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 193, 84,
194, 85, 86, 87, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
195, 223, 196, 88 };
static const int icvHersheyPlainItalic[] = {
(5 + 4*16) + CV_FONT_ITALIC_ALPHA + CV_FONT_HAVE_GREEK,
199, 214, 217, 233, 219, 197, 234, 216, 221, 222, 228, 225, 211, 224, 210, 220,
200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 212, 213, 191, 226, 192,
215, 190, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 193, 84,
194, 85, 86, 87, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161,
162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176,
195, 223, 196, 88 };
static const int icvHersheyComplexSmall[] = {
(6 + 7*16) + CV_FONT_HAVE_GREEK,
1199, 1214, 1217, 1275, 1274, 1271, 1272, 1216, 1221, 1222, 1219, 1232, 1211, 1231, 1210, 1220,
1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1212, 2213, 1241, 1238, 1242,
1215, 1273, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013,
1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1223, 1084,
1224, 1247, 586, 1249, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111,
1112
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -