一般情况下图像的边沿含有图像的主要信息,利用图像边沿含有的信息可以做图像识别。用一组加强
了方向性的 gabor 核和图像做卷积可以提取出图像的边沿信息。
这个程序叫 gledcv ,下载:
首先把一般的 gabor 核改一下加强方向性,改过的核在这个程序里叫 zegabor。
这图经过放大,实际用的卷积核比这个小很多。用一组不同方向的 zegabor 核和图像作卷积,在卷积结果图中,图像的边沿部分的坐标点上的不同方向结果中会有某一个或几个比平均值大很多,取这样的点做特征点,这些方向做特征值,可以构成一组特征用于图像识别。
这是要识别的目标图像的模板,右图上的红点是取得的特征点,黄线段是特征点上图像局部边沿的方向,就是此点上卷积结果模值最大的 zegabor 核的方向,通常一个模板图中随机取几十个这样的特征点就可以近似代表这个模板了。
进行图像识别和检测时把待测图像的对应点的特征值和标准模板图的对应值比较,如果一组特征值中
大多数近似就认为是找到了目标。
检测结果图,目标被蓝圈标识出来了。
这个算法效果还不错,对光照变化和局部遮挡也不大敏感,用 T6670 2.2G 双核 CPU openmp 并行,检
测一幅 800*600 的图像,目标旋转范围左右大约各 30 度,缩放 0.9 到 1.4 倍,大约用十几秒,这个算
法做特征匹配的时候有一定弹性,检测立体目标可以容忍大约十几度的视角变化(不同的目标,不同视角的
模板这个数值可能不同)。
这个方法可以检测立体目标,理论上用一组不同视角的模板组合可以做到全视角检测,不过目前每一模
板对视角变化的适应角度较小,全视角需要的模板数量多计算量比较大,下一步计划利用目标边沿的形状规
律预测视角变化的影响改进算法,并且利用 openmp , opencl等并行化技术提高检测速度。
这个程序叫 gledcv ,是用 Codeblocks/MinGW 写的还需要 opencv 开发库,程序不大只有一个C++源文件,工程文件是 gledcv.cbp 用 Codeblocks 可以打开,您可能需要修改其中的目录设置,没有使用 win32特有的 api ,源码移植到别的操作系统应该比较简单。 gledcv 运行时需要命令行参数,
gledcv
"example: gledcv ..\..\imgs\cat3d.jpg ..\..\imgs\scan301.jpg".
声明:gledcv 用到了 GNU GPL2 下发布的代码,所以我也在 GNU GPL2 下发布 gledcv。关于
GNU GPL2 参见:
我不能保证 gledcv 没有错误,建议仅用于测试,风险您要自己承担,引用请注明作者,欢迎提意见
和建议,请发邮件到 zhujiang@vmail.btvnet.net 或 zhujiangmail@hotmail.com 。
相关资源地址:
gabor 滤波:http://blog.csdn.net/yao_zhuang/archive/2008/06/10/2532279.aspx
opencv 开发库:
CodeBlocks:
2011.04.05
zhujiang
阅读(4566) | 评论(5) | 转发(0) |