opencv的filter是如何设计的?如何抽象的?
1. filter的要素有哪些?
成员 size与anchor
重载函数 void operator()(src, dst, dststep, dstcount, width)
2. filter有哪些?
create*Filter
3. filterEngine描述的是filter与image的关系
关系如下:
滤波函数boxFilter, blur, GuassianBlur, Sobel等基本上都会调用filterEngine类,来完成滤波操作,而且接口简单易用。
使用方法, 接口:
filterEngine = create*filter();
filterEngine->apply(src, dst);
filterPtr包含 各个具体filter的处理图像的抽象接口,即operator()重载函数,这是处理图像数据的具体真实途径。
如filterEngine->apply(src, dst);
apply函数就是调用filter的operator()函数,
例如 (*filter2D)((const uchar**)brows, dst, dststep, i, roi.width, cn);
针对二维的filter,调用Filter2D或MorphFilter的重载函数。
注意:filter2D是filterEngine中的BaseFilter的指针,而Filter2D是BaseFilter的子类。
接口简单,而实际上每种filter实际处理的过程和代码都一点不少。
子类Filter2D和MorphFilter包含了获取kernel的过程。
--------------------
image
borderInterpolate/copyMakeBorder,当需要扩展border时,左右、上下分别扩展
类型检查
borderInterpolate 是一维的边界插值函数
Various border types, image boundaries are denoted with '|'
* BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh
* BORDER_REFLECT: fedcba|abcdefgh|hgfedcb
* BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba
* BORDER_WRAP: cdefgh|abcdefgh|abcdefg
* BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii with some specified 'i'
copyMakeBorder 在图像image周围生成border
--------------------
这里filterEngine的设计理念:
1. 分离filter和image
2. 抽象filter接口,3种基本的抽象filter类
3. init中完成各个filter的初始化,及类型检查
4. 在apply、start函数中,完成filter过程