一、背景

opencv中只有像素级别轮廓提取,但工业中相机像素往往是有限的,要想提高检测精度,必须提取亚像素轮廓。

二、实现逻辑

将边缘幅度拟合成一个二维多项式,然后在梯度向量方向上提取其最大值(steger方法)。多项式拟合能通过与一个专用滤波器掩码(facet模型掩码)进行卷积来实现。

/// <summary>
/// 亚像素轮廓提取 
/// </summary>
/// <param name="gray">灰度图</param>
/// <param name="alpha">高斯核宽度</param>
/// <param name="low">低阈值</param>
/// <param name="high">高阈值</param>
/// <param name="contours">轮廓输出</param>
/// <param name="hierarchy">层级关系</param>
/// <param name="mode">轮廓提取模式</param>
void cvEdgesSubPix(const cv::Mat& gray, double alpha, int low, int high, std::vector<Contour>& contours, cv::OutputArray hierarchy = cv::noArray(), int mode = cv::RETR_LIST);

1.计算高斯一阶导数核,并计算梯度
2.利用非极大值抑制和滞后阈值获得像素边缘
3.对每个边缘点进行3X3领域拟合二阶多项式(facet模型)f(x,y)=a0 + a1x + a2y + a3x2 + a4xy + a5y2
4.通过hessian矩阵获得亚像素偏移量(fx= a1 fy= a2 fxx= 2a3 fxy= a4 fyy= a5)

三、效果

在这里插入图片描述
获取源码请私信,可指导配置技术交流

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐