OpenCV的Filter2D代码解析

本文深入解析了OpenCV中Filter2D函数的工作原理,包括如何处理边界、利用内建机制提高效率。重点阐述了源数据指针的移动方式、核操作的内存布局,以及对于大核时如何提升计算速度。通过对这些细节的理解,读者可以更好地理解和编写自定义filter代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Filter是一个非常耗时的操作,不过Opencv的Filter写法比较特别

这里把原理解析一下,就可以编写自己的filter代码了


1. 首先把边界预先处理,然后再处理非边界部分(防止溢出)

2. 每行处理dst图像,而src的指针加1,这里为什么是src++呢?实际上这里src保留的是源数据的每行首地址

3. 对于5*5的核来说,k_ptr实际上保留了与src有关的25个指针地址,分别对应kernel里面的每一项。这25个指针地址,也只是src的每行的首地址。

所以后面使用的时候,sptr = (*kp++) + i;其中kp就是这个首地址,偏置为i。k_ptr里面的每个值都是一个源图的图像数据地址。

也就是说,OpenCV在计算每个核的时候,首先把与dst每个像素对应的那个源数据区域所用的像素点地址计算出来了,这对于Sparse的核来说非常重要。另外,当核很大时,这样事先计算出地址的方法也能提高cache的概率。

4. 在while循环里面实现这个线性核的所有计算,比如,5*5的核,25个乘法和25个加法。kc表示核系数的首地址。


	for( ; count > 0; count--, dst += dst_step, src++ )      // 处理dst的每一行,每行之后,把src的指针+1,
    {                                                       
        for( k = 0; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值