zoukankan      html  css  js  c++  java
  • opencv ThickLine

    opencv  ThickLine

    static void ThickLine( Mat& img, Point2l p0, Point2l p1, const void* color,int thickness, int line_type, int flags, int shift )
    {
        static const double INV_XY_ONE = 1./XY_ONE;
    
        p0.x <<= XY_SHIFT - shift;
        p0.y <<= XY_SHIFT - shift;
        p1.x <<= XY_SHIFT - shift;
        p1.y <<= XY_SHIFT - shift;
    
        if( thickness <= 1 )
        {
            if( line_type < CV_AA )
            {
                if( line_type == 1 || line_type == 4 || shift == 0 )
                {
                    p0.x = (p0.x + (XY_ONE>>1)) >> XY_SHIFT;
                    p0.y = (p0.y + (XY_ONE>>1)) >> XY_SHIFT;
                    p1.x = (p1.x + (XY_ONE>>1)) >> XY_SHIFT;
                    p1.y = (p1.y + (XY_ONE>>1)) >> XY_SHIFT;
                    Line( img, p0, p1, color, line_type );
                }
                else
                    Line2( img, p0, p1, color );
            }
            else
                LineAA( img, p0, p1, color );
        }
        else
        {
            Point2l pt[4], dp = Point2l(0,0);
            double dx = (p0.x - p1.x)*INV_XY_ONE, dy = (p1.y - p0.y)*INV_XY_ONE;
            double r = dx * dx + dy * dy;
            int i, oddThickness = thickness & 1;
            thickness <<= XY_SHIFT - 1;
    
            if( fabs(r) > DBL_EPSILON )
            {
                r = (thickness + oddThickness*XY_ONE*0.5)/std::sqrt(r);
                dp.x = cvRound( dy * r );
                dp.y = cvRound( dx * r );
    
                pt[0].x = p0.x + dp.x;
                pt[0].y = p0.y + dp.y;
                pt[1].x = p0.x - dp.x;
                pt[1].y = p0.y - dp.y;
                pt[2].x = p1.x - dp.x;
                pt[2].y = p1.y - dp.y;
                pt[3].x = p1.x + dp.x;
                pt[3].y = p1.y + dp.y;
    
                FillConvexPoly( img, pt, 4, color, line_type, XY_SHIFT );
            }
    
            for( i = 0; i < 2; i++ )
            {
                if( flags & (i+1) )
                {
                    if( line_type < CV_AA )
                    {
                        Point center;
                        center.x = (int)((p0.x + (XY_ONE>>1)) >> XY_SHIFT);
                        center.y = (int)((p0.y + (XY_ONE>>1)) >> XY_SHIFT);
                        Circle( img, center, (thickness + (XY_ONE>>1)) >> XY_SHIFT, color, 1 );
                    }
                    else
                    {
                        EllipseEx( img, p0, Size2l(thickness, thickness),
                                   0, 0, 360, color, -1, line_type );
                    }
                }
                p0 = p1;
            }
        }
    }

    #############################################

  • 相关阅读:
    redis 数据类型详解 以及 redis适用场景场合
    angular.js记录
    Python chr() 函数
    Python frozenset() 函数
    Python 字典 dict() 函数
    Python set() 函数
    Python tuple 函数
    Python eval() 函数
    Python repr() 函数
    Python str() 函数
  • 原文地址:https://www.cnblogs.com/herd/p/15413849.html
Copyright © 2011-2022 走看看