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

原型:

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

源码解析:

  1. cv::Mat cv::getStructuringElement(int shape, Size ksize, Point anchor)
  2. {
  3. int i, j;
  4. int r = , c = ;
  5. double inv_r2 = ;
  6.  
  7. CV_Assert( shape == MORPH_RECT || shape == MORPH_CROSS || shape == MORPH_ELLIPSE );        //目前支持三种形状的单元创建: 矩形, 十字形, 椭圆形;
  8.  
  9. anchor = normalizeAnchor(anchor, ksize);                    //当默认为-1,-1时, 计算anchor;
  10.  
  11. if( ksize == Size(,) )                  //当给定大小为1,1时,表明是一个点, 可以用矩形来表示;
  12. shape = MORPH_RECT;
  13.  
  14. if( shape == MORPH_ELLIPSE )               //椭圆;
  15. {
  16. r = ksize.height/;
  17. c = ksize.width/;
  18. inv_r2 = r ? ./((double)r*r) : ;
  19. }
  20.  
  21. Mat elem(ksize, CV_8U);
  22.  
  23. for( i = ; i < ksize.height; i++ )                    //对每一行,计算0,1的范围;
  24. {
  25. uchar* ptr = elem.ptr(i);
  26. int j1 = , j2 = ;
  27.  
  28. if( shape == MORPH_RECT || (shape == MORPH_CROSS && i == anchor.y) )        //矩形,或十字y锚点时 j2为ksize.width;
  29. j2 = ksize.width;
  30. else if( shape == MORPH_CROSS )
  31. j1 = anchor.x, j2 = j1 + ;
  32. else                                               //椭圆;
  33. {
  34. int dy = i - r;
  35. if( std::abs(dy) <= r )
  36. {
  37. int dx = saturate_cast<int>(c*std::sqrt((r*r - dy*dy)*inv_r2));        //计算得到x的偏移;
  38. j1 = std::max( c - dx, );
  39. j2 = std::min( c + dx + , ksize.width );
  40. }
  41. }
  42.  
  43. for( j = ; j < j1; j++ )                //从这三个for可以看出, (0,j1)之间为 0, (j1, j2)之间为1, (j2, ksize.width)之间为0;
  44. ptr[j] = ;
  45. for( ; j < j2; j++ )
  46. ptr[j] = ;
  47. for( ; j < ksize.width; j++ )
  48. ptr[j] = ;
  49. }
  50.  
  51. return elem;
  52. }

opencv源码学习: getStructuringElement函数;的更多相关文章

  1. opencv源码学习: getGaussianKernel( 高斯核);

    参考: https://blog.csdn.net/u012633319/article/details/80921023 二维高斯核, 可以根据下面的公式推到为两个一维高斯核的乘积: 原型: /** ...

  2. igmpproxy源码学习——igmpProxyInit()

    igmpproxy源码学习--igmpProxyInit()函数具体解释.igmpproxy初始化 在执行igmpproxy的主程序igmpproxyRun()之前须要对igmpproxy进行一些配置 ...

  3. Hadoop源码学习笔记(2) ——进入main函数打印包信息

    Hadoop源码学习笔记(2) ——进入main函数打印包信息 找到了main函数,也建立了快速启动的方法,然后我们就进去看一看. 进入NameNode和DataNode的主函数后,发现形式差不多: ...

  4. Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类

    Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何 ...

  5. __sync_fetch_and_add函数(Redis源码学习)

    __sync_fetch_and_add函数(Redis源码学习) 在学习redis-3.0源码中的sds文件时,看到里面有如下的C代码,之前从未接触过,所以为了全面学习redis源码,追根溯源,学习 ...

  6. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  7. 我的angularjs源码学习之旅2——依赖注入

    依赖注入起源于实现控制反转的典型框架Spring框架,用来削减计算机程序的耦合问题.简单来说,在定义方法的时候,方法所依赖的对象就被隐性的注入到该方法中,在方法中可以直接使用,而不需要在执行该函数的时 ...

  8. 【iScroll源码学习03】iScroll事件机制与滚动条的实现

    前言 想不到又到周末了,周末的时间要抓紧学习才行,前几天我们学习了iScroll几点基础知识: 1. [iScroll源码学习02]分解iScroll三个核心事件点 2. [iScroll源码学习01 ...

  9. nginx源码学习资源(不断更新)

    nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...

随机推荐

  1. C# DataTable 操作

    添加引用 using System.Data; 创建表 //创建一个空表 DataTable dt = new DataTable(); //创建一个名为"Table_New"的空 ...

  2. [BZOJ 2186] [SDOI 2008] 沙拉公主的困惑

    Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为 \(1\) 到 \(N\) 的阶乘,但是,政府只发行编号与 \(M!\) 互质的钞票.房地产第 ...

  3. Codeforces986C AND Graph 【位运算】【dfs】

    题目大意: 一张$ m $个编号互异点图,最大不超过$ 2^n $,若两个编号位与为0则连边,问连通块数量. 题目分析: 考虑怎样的两个点会连边.这种说法对于A和B两个点来说,就相当于B在A的0的子集 ...

  4. Docker镜像的使用

    当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载. 下面我们来学习: 1.管理和使用本地 Docker ...

  5. 解决Eclipse每次修改完代码后需要先Clean,不然修改的代码无效

    工具栏 Project-->Build Automatically 勾选上即可

  6. while(~scanf(..))为什么可以这样写

    因为读到文件的结束符时,scanf返回值是EOF,也就是-1,而~(-1)的作用就是对-1的按位取反. 在计算机中,数字按补码存储,正数的补码和原码一样,负数的补码是其反码+1,反码也就是符号位仍为1 ...

  7. 自学华为IoT物联网之路

    自学华为IoT物联网之路 01 自学华为IoT物联网_01 物联网概述 02 自学华为IoT物联网_02 常见物联网通信技术 03 自学华为IoT物联网_03 公共事业物联网常见问题及解决方案 04  ...

  8. [复习]动态dp

    [复习]动态dp 你还是可以认为我原来写的动态dp就是在扯蛋. [Luogu4719][模板]动态dp 首先作为一个\(dp\)题,我们显然可以每次修改之后都进行暴力\(dp\),设\(f[i][0/ ...

  9. 【BZOJ1152】歌唱王国(生成函数,KMP)

    [BZOJ1152]歌唱王国(生成函数,KMP) 题面 BZOJ 洛谷 题解 根据\(YMD\)论文来的QwQ. 首先大家都知道普通型生成函数是\(\displaystyle \sum_{i=0}^{ ...

  10. bzoj4240有趣的家庭菜园(贪心+逆序对)

    对家庭菜园有兴趣的JOI君每年在自家的田地中种植一种叫做IOI草的植物.JOI君的田地沿东西方向被划分为N个区域,由西到东标号为1~N.IOI草一共有N株,每个区域种植着一株.在第i个区域种植的IOI ...