C++ 图像处理——升级版卡尺标定法径向扫描拟合圆,附代码
使用语言:C++/Opencv4.3
我针对上一个版本有了一些小改进,不过之前的版本能拟合一个圆环。并对运行速度有了比较大的提升,我先把效果图放上来吧。
红色的点是我拟定的圆心,绿色的是通过拟合算法得出的圆,绿色的点也是拟合找到的圆心,还有一些参数我在下面介绍。
总体的方法基本不变,还是使用的卡尺的方法。参考的还是Halcon的算子方式。对于参数的设置,看下面:
struct CircleLocConfig
{
cv::Point center; //拟合圆心
int radius[2] = {0,0}; //卡尺的半径
bool edge_direction = true; //边缘方向 False:由黑到白 true:由白到黑
int selection_of_edge = 0; //边缘点的选择方式 0:梯度最大 1:第一个满足梯度阈值的点 2:最后一个满足梯度阈值的点
int edge_threshold = 30; //边缘阈值:梯度值大于此阈值才能算边缘点
int starting_angle = 0; //起始角
int termination_angle = 360; //终止角
int angle_step; //角度步长(径向扫描采样数量)
};
可以通过这么些参数来设置,相当于设置一个ROI区域一样,来选择这么拟合圆。向上面的那个效果图,就是将红色的点设为ROI区域的圆心,然后将卡尺的头端和尾端设置到合适的长度就行了,至于边缘方向那些,我就是设置的第一个梯度点、从白到黑的梯度,起始角为0,终止角度为360,步长是360,相当于每一度就设置一个卡尺。
大概示意图是这样的:
灰色的就是卡尺,相当于ROI。
好像蛮丑的。哈哈哈。
代码是原创,进行了封装,注释我也尽可能打全了,会提供.cpp和.h 文件,花了几天才敲出来,收个几块钱混口饭吃,希望大家多多包涵。(●’◡’●)
链接: https://download.csdn.net/download/qq_40374812/20603810.