opencv 亚像素轮廓提取
·
一、背景
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)
三、效果

获取源码请私信,可指导配置技术交流
更多推荐
所有评论(0)