⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cxdrawing.cpp

📁 将OpenCV移植到DSP上
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    0.5877853f, 0.5735764f, 0.5591929f, 0.5446390f, 0.5299193f, 0.5150381f,    0.5000000f, 0.4848096f, 0.4694716f, 0.4539905f, 0.4383711f, 0.4226183f,    0.4067366f, 0.3907311f, 0.3746066f, 0.3583679f, 0.3420201f, 0.3255682f,    0.3090170f, 0.2923717f, 0.2756374f, 0.2588190f, 0.2419219f, 0.2249511f,    0.2079117f, 0.1908090f, 0.1736482f, 0.1564345f, 0.1391731f, 0.1218693f,    0.1045285f, 0.0871557f, 0.0697565f, 0.0523360f, 0.0348995f, 0.0174524f,    0.0000000f, -0.0174524f, -0.0348995f, -0.0523360f, -0.0697565f, -0.0871557f,    -0.1045285f, -0.1218693f, -0.1391731f, -0.1564345f, -0.1736482f, -0.1908090f,    -0.2079117f, -0.2249511f, -0.2419219f, -0.2588190f, -0.2756374f, -0.2923717f,    -0.3090170f, -0.3255682f, -0.3420201f, -0.3583679f, -0.3746066f, -0.3907311f,    -0.4067366f, -0.4226183f, -0.4383711f, -0.4539905f, -0.4694716f, -0.4848096f,    -0.5000000f, -0.5150381f, -0.5299193f, -0.5446390f, -0.5591929f, -0.5735764f,    -0.5877853f, -0.6018150f, -0.6156615f, -0.6293204f, -0.6427876f, -0.6560590f,    -0.6691306f, -0.6819984f, -0.6946584f, -0.7071068f, -0.7193398f, -0.7313537f,    -0.7431448f, -0.7547096f, -0.7660444f, -0.7771460f, -0.7880108f, -0.7986355f,    -0.8090170f, -0.8191520f, -0.8290376f, -0.8386706f, -0.8480481f, -0.8571673f,    -0.8660254f, -0.8746197f, -0.8829476f, -0.8910065f, -0.8987940f, -0.9063078f,    -0.9135455f, -0.9205049f, -0.9271839f, -0.9335804f, -0.9396926f, -0.9455186f,    -0.9510565f, -0.9563048f, -0.9612617f, -0.9659258f, -0.9702957f, -0.9743701f,    -0.9781476f, -0.9816272f, -0.9848078f, -0.9876883f, -0.9902681f, -0.9925462f,    -0.9945219f, -0.9961947f, -0.9975641f, -0.9986295f, -0.9993908f, -0.9998477f,    -1.0000000f, -0.9998477f, -0.9993908f, -0.9986295f, -0.9975641f, -0.9961947f,    -0.9945219f, -0.9925462f, -0.9902681f, -0.9876883f, -0.9848078f, -0.9816272f,    -0.9781476f, -0.9743701f, -0.9702957f, -0.9659258f, -0.9612617f, -0.9563048f,    -0.9510565f, -0.9455186f, -0.9396926f, -0.9335804f, -0.9271839f, -0.9205049f,    -0.9135455f, -0.9063078f, -0.8987940f, -0.8910065f, -0.8829476f, -0.8746197f,    -0.8660254f, -0.8571673f, -0.8480481f, -0.8386706f, -0.8290376f, -0.8191520f,    -0.8090170f, -0.7986355f, -0.7880108f, -0.7771460f, -0.7660444f, -0.7547096f,    -0.7431448f, -0.7313537f, -0.7193398f, -0.7071068f, -0.6946584f, -0.6819984f,    -0.6691306f, -0.6560590f, -0.6427876f, -0.6293204f, -0.6156615f, -0.6018150f,    -0.5877853f, -0.5735764f, -0.5591929f, -0.5446390f, -0.5299193f, -0.5150381f,    -0.5000000f, -0.4848096f, -0.4694716f, -0.4539905f, -0.4383711f, -0.4226183f,    -0.4067366f, -0.3907311f, -0.3746066f, -0.3583679f, -0.3420201f, -0.3255682f,    -0.3090170f, -0.2923717f, -0.2756374f, -0.2588190f, -0.2419219f, -0.2249511f,    -0.2079117f, -0.1908090f, -0.1736482f, -0.1564345f, -0.1391731f, -0.1218693f,    -0.1045285f, -0.0871557f, -0.0697565f, -0.0523360f, -0.0348995f, -0.0174524f,    -0.0000000f, 0.0174524f, 0.0348995f, 0.0523360f, 0.0697565f, 0.0871557f,    0.1045285f, 0.1218693f, 0.1391731f, 0.1564345f, 0.1736482f, 0.1908090f,    0.2079117f, 0.2249511f, 0.2419219f, 0.2588190f, 0.2756374f, 0.2923717f,    0.3090170f, 0.3255682f, 0.3420201f, 0.3583679f, 0.3746066f, 0.3907311f,    0.4067366f, 0.4226183f, 0.4383711f, 0.4539905f, 0.4694716f, 0.4848096f,    0.5000000f, 0.5150381f, 0.5299193f, 0.5446390f, 0.5591929f, 0.5735764f,    0.5877853f, 0.6018150f, 0.6156615f, 0.6293204f, 0.6427876f, 0.6560590f,    0.6691306f, 0.6819984f, 0.6946584f, 0.7071068f, 0.7193398f, 0.7313537f,    0.7431448f, 0.7547096f, 0.7660444f, 0.7771460f, 0.7880108f, 0.7986355f,    0.8090170f, 0.8191520f, 0.8290376f, 0.8386706f, 0.8480481f, 0.8571673f,    0.8660254f, 0.8746197f, 0.8829476f, 0.8910065f, 0.8987940f, 0.9063078f,    0.9135455f, 0.9205049f, 0.9271839f, 0.9335804f, 0.9396926f, 0.9455186f,    0.9510565f, 0.9563048f, 0.9612617f, 0.9659258f, 0.9702957f, 0.9743701f,    0.9781476f, 0.9816272f, 0.9848078f, 0.9876883f, 0.9902681f, 0.9925462f,    0.9945219f, 0.9961947f, 0.9975641f, 0.9986295f, 0.9993908f, 0.9998477f,    1.0000000f};static voidicvSinCos( int angle, float *cosval, float *sinval ){    angle += (angle < 0 ? 360 : 0);    *sinval = icvSinTable[angle];    *cosval = icvSinTable[450 - angle];}/*    constructs polygon that represents elliptic arc.*/CV_IMPL intcvEllipse2Poly( CvPoint center, CvSize axes, int angle,                int arc_start, int arc_end, CvPoint* pts, int delta ){    float alpha, beta;    double size_a = axes.width, size_b = axes.height;    double cx = center.x, cy = center.y;    CvPoint *pts_origin = pts;    int i;    while( angle < 0 )        angle += 360;    while( angle > 360 )        angle -= 360;    if( arc_start > arc_end )    {        i = arc_start;        arc_start = arc_end;        arc_end = i;    }    while( arc_start < 0 )    {        arc_start += 360;        arc_end += 360;    }    while( arc_end > 360 )    {        arc_end -= 360;        arc_start -= 360;    }    if( arc_end - arc_start > 360 )    {        arc_start = 0;        arc_end = 360;    }    icvSinCos( angle, &alpha, &beta );    for( i = arc_start; i < arc_end + delta; i += delta )    {        double x, y;        angle = i;        if( angle > arc_end )            angle = arc_end;        if( angle < 0 )            angle += 360;                x = size_a * icvSinTable[450-angle];        y = size_b * icvSinTable[angle];        pts->x = cvRound( cx + x * alpha - y * beta );        pts->y = cvRound( cy - x * beta - y * alpha );        pts += i == arc_start || pts->x != pts[-1].x || pts->y != pts[-1].y;    }    i = (int)(pts - pts_origin);    for( ; i < 2; i++ )        pts_origin[i] = pts_origin[i-1];    return i;}/****************************************************************************************\*                                Polygons filling                                        * \****************************************************************************************//* helper macros: filling horizontal row */#define ICV_HLINE( ptr, xl, xr, color, pix_size )            \{                                                            \    uchar* hline_ptr = (uchar*)(ptr) + (xl)*(pix_size);      \    uchar* hline_max_ptr = (uchar*)(ptr) + (xr)*(pix_size);  \                                                             \    for( ; hline_ptr <= hline_max_ptr; hline_ptr += (pix_size))\    {                                                        \        int hline_j;                                         \        for( hline_j = 0; hline_j < (pix_size); hline_j++ )  \        {                                                    \            hline_ptr[hline_j] = ((uchar*)color)[hline_j];   \        }                                                    \    }                                                        \}/* filling convex polygon. v - array of vertices, ntps - number of points */static voidicvFillConvexPoly( CvMat* img, CvPoint *v, int npts, const void* color, int line_type, int shift ){    struct    {        int idx, di;        int x, dx, ye;    }    edge[2];    int delta = shift ? 1 << (shift - 1) : 0;    int i, y, imin = 0, left = 0, right = 1, x1, x2;    int edges = npts;    int xmin, xmax, ymin, ymax;    uchar* ptr = img->data.ptr;    CvSize size = cvGetMatSize( img );    int pix_size = CV_ELEM_SIZE(img->type);    CvPoint p0;    int delta1, delta2;    if( line_type < CV_AA )        delta1 = delta2 = XY_ONE >> 1;        //delta1 = 0, delta2 = XY_ONE - 1;    else        delta1 = XY_ONE - 1, delta2 = 0;    p0 = v[npts - 1];    p0.x <<= XY_SHIFT - shift;    p0.y <<= XY_SHIFT - shift;    assert( 0 <= shift && shift <= XY_SHIFT );    xmin = xmax = v[0].x;    ymin = ymax = v[0].y;    for( i = 0; i < npts; i++ )    {        CvPoint p = v[i];        if( p.y < ymin )        {            ymin = p.y;            imin = i;        }        ymax = MAX( ymax, p.y );        xmax = MAX( xmax, p.x );        xmin = MIN( xmin, p.x );        p.x <<= XY_SHIFT - shift;        p.y <<= XY_SHIFT - shift;        if( line_type <= 8 )        {            if( shift == 0 )            {                CvPoint pt0, pt1;                pt0.x = p0.x >> XY_SHIFT;                pt0.y = p0.y >> XY_SHIFT;                pt1.x = p.x >> XY_SHIFT;                pt1.y = p.y >> XY_SHIFT;                icvLine( img, pt0, pt1, color, line_type );            }            else                icvLine2( img, p0, p, color );        }        else            icvLineAA( img, p0, p, color );        p0 = p;    }    xmin = (xmin + delta) >> shift;    xmax = (xmax + delta) >> shift;    ymin = (ymin + delta) >> shift;    ymax = (ymax + delta) >> shift;    if( npts < 3 || xmax < 0 || ymax < 0 || xmin >= size.width || ymin >= size.height )        return;    ymax = MIN( ymax, size.height - 1 );    edge[0].idx = edge[1].idx = imin;    edge[0].ye = edge[1].ye = y = ymin;    edge[0].di = 1;    edge[1].di = npts - 1;    ptr += img->step*y;    do    {        if( line_type < CV_AA || y < ymax || y == ymin )        {            for( i = 0; i < 2; i++ )            {                if( y >= edge[i].ye )                {                    int idx = edge[i].idx, di = edge[i].di;                    int xs = 0, xe, ye, ty = 0;                    for(;;)                    {                        ty = (v[idx].y + delta) >> shift;                        if( ty > y || edges == 0 )                            break;                        xs = v[idx].x;                        idx += di;                        idx -= ((idx < npts) - 1) & npts;   /* idx -= idx >= npts ? npts : 0 */                        edges--;                    }                    ye = ty;                    xs <<= XY_SHIFT - shift;                    xe = v[idx].x << (XY_SHIFT - shift);                    /* no more edges */                    if( y >= ye )                        return;                    edge[i].ye = ye;                    edge[i].dx = ((xe - xs)*2 + (ye - y)) / (2 * (ye - y));                    edge[i].x = xs;                    edge[i].idx = idx;                }            }        }        if( edge[left].x > edge[right].x )        {            left ^= 1;            right ^= 1;        }        x1 = edge[left].x;        x2 = edge[right].x;        if( y >= 0 )        {            int xx1 = (x1 + delta1) >> XY_SHIFT;            int xx2 = (x2 + delta2) >> XY_SHIFT;            if( xx2 >= 0 && xx1 < size.width )            {                if( xx1 < 0 )                    xx1 = 0;                if( xx2 >= size.width )                    xx2 = size.width - 1;                ICV_HLINE( ptr, xx1, xx2, color, pix_size );            }        }        x1 += edge[left].dx;        x2 += edge[right].dx;        edge[left].x = x1;        edge[right].x = x2;        ptr += img->step;    }    while( ++y <= ymax );}/**************** helper macros and functions for sequence/contour processing ***********//* draws simple or filled circle */static voidicvCircle( CvMat* img, CvPoint center, int radius, const void* color, int fill ){    CvSize size = cvGetMatSize( img );    int step = img->step;    int pix_size = CV_ELEM_SIZE(img->type);    uchar* ptr = (uchar*)(img->data.ptr);    int err = 0, dx = radius, dy = 0, plus = 1, minus = (radius << 1) - 1;    int inside = center.x >= radius && center.x < size.width - radius &&        center.y >= radius && center.y < size.height - radius;    #define ICV_PUT_POINT( ptr, x )     \        CV_MEMCPY_CHAR( ptr + (x)*pix_size, color, pix_size );    while( dx >= dy )    {        int mask;        int y11 = center.y - dy, y12 = center.y + dy, y21 = center.y - dx, y22 = center.y + dx;        int x11 = center.x - dx, x12 = center.x + dx, x21 = center.x - dy, x22 = center.x + dy;        if( inside )        {            uchar *tptr0 = ptr + y11 * step;            uchar *tptr1 = ptr + y12 * step;                        if( !fill )            {                ICV_PUT_POINT( tptr0, x11 );                ICV_PUT_POINT( tptr1, x11 );                ICV_PUT_POINT( tptr0, x12 );                ICV_PUT_POINT( tptr1, x12 );            }            else            {                ICV_HLINE( tptr0, x11, x12, color, pix_size );                ICV_HLINE( tptr1, x11, x12, color, pix_size );            }            tptr0 = ptr + y21 * step;            tptr1 = ptr + y22 * step;            if( !fill )            {                ICV_PUT_POINT( tptr0, x21 );                ICV_PUT_POINT( tptr1, x21 );                ICV_PUT_POINT( tptr0, x22 );                ICV_PUT_POINT( tptr1, x22 );            }            else            {                ICV_HLINE( tptr0, x21, x22, color, pix_size );                ICV_HLINE( tptr1, x21, x22, color, pix_size );            }        }        else if( x11 < size.width && x12 >= 0 && y21 < size.height && y22 >= 0 )        {            if( fill )            {                x11 = MAX( x11, 0 );                x12 = MIN( x12, size.width - 1 );            }                        if( (unsigned)y11 < (unsigned)size.height )            {                uchar *tptr = ptr + y11 * step;                if( !fill )                {                    if( x11 >= 0 )                        ICV_PUT_POINT( tptr, x11 );                    if( x12 < size.width )                        ICV_PUT_POINT( tptr, x12 );                }                else                    ICV_HLINE( tptr, x11, x12, color, pix_size );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -