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(-,-));
源码解析:
cv::Mat cv::getStructuringElement(int shape, Size ksize, Point anchor)
{
int i, j;
int r = , c = ;
double inv_r2 = ; CV_Assert( shape == MORPH_RECT || shape == MORPH_CROSS || shape == MORPH_ELLIPSE ); //目前支持三种形状的单元创建: 矩形, 十字形, 椭圆形; anchor = normalizeAnchor(anchor, ksize); //当默认为-1,-1时, 计算anchor; if( ksize == Size(,) ) //当给定大小为1,1时,表明是一个点, 可以用矩形来表示;
shape = MORPH_RECT; if( shape == MORPH_ELLIPSE ) //椭圆;
{
r = ksize.height/;
c = ksize.width/;
inv_r2 = r ? ./((double)r*r) : ;
} Mat elem(ksize, CV_8U); for( i = ; i < ksize.height; i++ ) //对每一行,计算0,1的范围;
{
uchar* ptr = elem.ptr(i);
int j1 = , j2 = ; 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 + ;
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, );
j2 = std::min( c + dx + , ksize.width );
}
} for( j = ; j < j1; j++ ) //从这三个for可以看出, (0,j1)之间为 0, (j1, j2)之间为1, (j2, ksize.width)之间为0;
ptr[j] = ;
for( ; j < j2; j++ )
ptr[j] = ;
for( ; j < ksize.width; j++ )
ptr[j] = ;
} return elem;
}
opencv源码学习: getStructuringElement函数;的更多相关文章
- opencv源码学习: getGaussianKernel( 高斯核);
参考: https://blog.csdn.net/u012633319/article/details/80921023 二维高斯核, 可以根据下面的公式推到为两个一维高斯核的乘积: 原型: /** ...
- igmpproxy源码学习——igmpProxyInit()
igmpproxy源码学习--igmpProxyInit()函数具体解释.igmpproxy初始化 在执行igmpproxy的主程序igmpproxyRun()之前须要对igmpproxy进行一些配置 ...
- Hadoop源码学习笔记(2) ——进入main函数打印包信息
Hadoop源码学习笔记(2) ——进入main函数打印包信息 找到了main函数,也建立了快速启动的方法,然后我们就进去看一看. 进入NameNode和DataNode的主函数后,发现形式差不多: ...
- Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类
Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何 ...
- __sync_fetch_and_add函数(Redis源码学习)
__sync_fetch_and_add函数(Redis源码学习) 在学习redis-3.0源码中的sds文件时,看到里面有如下的C代码,之前从未接触过,所以为了全面学习redis源码,追根溯源,学习 ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- 我的angularjs源码学习之旅2——依赖注入
依赖注入起源于实现控制反转的典型框架Spring框架,用来削减计算机程序的耦合问题.简单来说,在定义方法的时候,方法所依赖的对象就被隐性的注入到该方法中,在方法中可以直接使用,而不需要在执行该函数的时 ...
- 【iScroll源码学习03】iScroll事件机制与滚动条的实现
前言 想不到又到周末了,周末的时间要抓紧学习才行,前几天我们学习了iScroll几点基础知识: 1. [iScroll源码学习02]分解iScroll三个核心事件点 2. [iScroll源码学习01 ...
- nginx源码学习资源(不断更新)
nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...
随机推荐
- git bash 下操作文件及文件夹命令
1, cd : change directory的简写,改变目录的意思,就是切换到哪个目录下, 如 cd e:\fff 切换 E 盘下面的fff 目录. 当我们用cd 进入文件夹时,我们可以使用 通 ...
- LTI系统对WSS Processes的作用
本文主要专注讨论LTI系统对WSS Process的影响.WSS Process的主要特性有mean以及correlation,其中correlation特性在滤波器设计,信号检测,信号预测以及系统识 ...
- Qt 使用openGL 渲染NV12格式的视频
直接上代码 Nv12Render.h #ifndef NV12RENDER_H #define NV12RENDER_H #include <QOpenGLFunctions> #incl ...
- 转 Debugging AutoCAD 2017 using Visual Studio 2015
原文地址: http://adndevblog.typepad.com/autocad/2016/05/debugging-autocad-2017-using-visual-studio-2015. ...
- @ControllerAdvice+@ExceptionHandler处理架构异常捕获
1.注解引入 1) @ControllerAdvice - 控制器增强 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) ...
- Go中的Init函数
init函数会在main函数执行之前进行执行.init用在设置包.初始化变量或者其他要在程序运行前优先完成的引导工作. 举例:在进行数据库注册驱动的时候. 这里有init函数 package post ...
- linux-shell系列4-init
#!/bin/bash # 过滤出MAC地址MAC=`ifconfig |awk '{print $5}'|sed -n '1p;1q'` # 过滤网卡名字NET_NAME=`ifconfig |aw ...
- Vue——轻松实现vue底部点击加载更多
前言 需求总是不断改变的,好吧,今天就把vue如何实现逐步加载更多和分布加载更多说下,默认你知道如何去请求数据的哈 一次请求 页面 使用slice来进行限制展现从0,a的数据 <div v-fo ...
- 查询SQLSERVER中系统表结构
Declare @TableName Varchar(20); SET @TableName='B_SupplierDA'; --SELECT TE.字段名+',' --FROM ( SELECT ( ...
- urllib的实现---请求响应and请求头处理
在python3中 urllib库和urilib2库合并成了urllib库..其中urllib2.urlopen()变成了urllib.request.urlopen()urllib2.Request ...