• opencv源码学习: getStructuringElement函数;


    getStructuringElement函数归属于形态学,可以建立指定大小、形状的结构;

    原型: 

    /** @brief Returns a structuring element of the specified size and shape for morphological operations.
    
    The function constructs and returns the structuring element that can be further passed to cv::erode,
    cv::dilate or cv::morphologyEx. But you can also construct an arbitrary binary mask yourself and use it as
    the structuring element.
    
    @param shape Element shape that could be one of cv::MorphShapes
    @param ksize Size of the structuring element.
    @param anchor Anchor position within the element. The default value f$(-1, -1)f$ means that the
    anchor is at the center. Note that only the shape of a cross-shaped element depends on the anchor
    position. In other cases the anchor just regulates how much the result of the morphological
    operation is shifted.
     */
    CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

    源码解析:

    cv::Mat cv::getStructuringElement(int shape, Size ksize, Point anchor)
    {
        int i, j;
        int r = 0, c = 0;
        double inv_r2 = 0;
    
        CV_Assert( shape == MORPH_RECT || shape == MORPH_CROSS || shape == MORPH_ELLIPSE );        //目前支持三种形状的单元创建: 矩形, 十字形, 椭圆形;
    
        anchor = normalizeAnchor(anchor, ksize);                    //当默认为-1,-1时, 计算anchor;
    
        if( ksize == Size(1,1) )                  //当给定大小为1,1时,表明是一个点, 可以用矩形来表示;
            shape = MORPH_RECT;
    
        if( shape == MORPH_ELLIPSE )               //椭圆;
        {
            r = ksize.height/2;
            c = ksize.width/2;
            inv_r2 = r ? 1./((double)r*r) : 0;
        }
    
        Mat elem(ksize, CV_8U);
    
        for( i = 0; i < ksize.height; i++ )                    //对每一行,计算0,1的范围;
        {
            uchar* ptr = elem.ptr(i);
            int j1 = 0, j2 = 0;
    
            if( shape == MORPH_RECT || (shape == MORPH_CROSS && i == anchor.y) )        //矩形,或十字y锚点时  j2为ksize.width;
                j2 = ksize.width;
            else if( shape == MORPH_CROSS )
                j1 = anchor.x, j2 = j1 + 1;
            else                                               //椭圆;
            {
                int dy = i - r;
                if( std::abs(dy) <= r )
                {
                    int dx = saturate_cast<int>(c*std::sqrt((r*r - dy*dy)*inv_r2));        //计算得到x的偏移;
                    j1 = std::max( c - dx, 0 );
                    j2 = std::min( c + dx + 1, ksize.width );
                }
            }
    
            for( j = 0; j < j1; j++ )                //从这三个for可以看出, (0,j1)之间为 0,  (j1, j2)之间为1,  (j2, ksize.width)之间为0;
                ptr[j] = 0;
            for( ; j < j2; j++ )
                ptr[j] = 1;
            for( ; j < ksize.width; j++ )
                ptr[j] = 0;
        }
    
        return elem;
    }
  • 相关阅读:
    网络对抗技术 20192424 Exp7 网络欺诈防范
    CAN帧格式解析
    C语言复杂的指针
    堆栈段的用途
    uniapp益智五子棋小程序
    穿山甲GroMore广告—(Banner广告)——Android_Unity广告系列文章03
    穿山甲GroMore广告(概览)——Unity游戏接入广告Android篇02
    穿山甲GroMore广告—(信息流广告)——Android_Unity广告系列文章04
    使用Android发布Unity无法破解的问题
    Json Number Format 异常 Expected an int but was 2168520652 at line 1 column 325
  • 原文地址:https://www.cnblogs.com/yinwei-space/p/9833294.html
Copyright © 2020-2023  润新知