DOG角点检测——opencv实现

本文介绍了DOG(Difference of Gaussian)角点检测的原理和实现细节,通过在OpenCV中应用高斯滤波和差分操作来检测图像中的角点。讨论了可能影响运算速度的环节,并给出了测试结果。
摘要由CSDN通过智能技术生成

1.原理

Difference of Gaussian(DOG)是高斯函数的差分。将两幅图像在不同参数下的高斯滤波结果相减,得到DoG图。步骤:

  • 处理一幅图像在不同高斯参数下的DoG
    用两个不同的5x5高斯核对图像进行卷积,然后再相减的操作。重复三次得到三个差分图A,B,C。

  • 根据DoG求角点
    计算出的A,B,C三个DOG图中求图B中是极值的点。图B的点在当前由A,B,C共27个点组成的block中是否为极大值或者极小值。若满足此条件则认为是角点。

2.实现细节

2.1 差分得到DoG图
Mat Process(Mat &img, double sig1, double sig2, Size Ksize)
  • converTo()
    直接读取灰度图会得到CV_8UC1类型的mat,是单通道uchar型矩阵,因此高斯滤波后相减都是整型非负数据,影响后面进行比较取极值的步骤。所以需要将原本的数据类型转化为CV_32FC1即单通道float型数据。再进行后续的操作
  • subtract()
    两个mat类型相减直接用这个就好了。刚开始查到cvSub函数是老版本的,里面的指针乱七八糟的都挺复杂的,后在官方说明上找到这个c++版本的函数。现在的操作基本都是这个了。
2.2 求取当前block极值得到角点
Mat getExtrema(Mat &A, Mat &B, Mat &C, int thresh){}
    block.release();
    block.push_back(A(Range(i - 1, i + 2), Range(j - 1, j + 2)));
    block.push_back(B(Range(i - 1, i + 2), Range(j - 1, j + 2)));
    block.push_back(C(Range(i - 1, i + 2), Range(j - 1, j + 2)));
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值