圆卡尺,建坐标系,拟合圆,高斯滤波,双边滤波

圆卡尺,建坐标系,拟合圆

圆卡尺找圆部分

多方向径向卡尺函数,用于从图像中检测圆形物体的边缘点,基于灰度差分原理模拟工业视觉中的 "径向卡尺" 功能

  • 从指定圆心出发,在多个均匀分布的径向方向上,在设定的半径范围内检测符合条件的边缘点,最终将所有检测到的边缘点通过引用参数返回,可用于后续圆拟合(如计算圆心、半径)
cpp 复制代码
static void RadialWithGrayDiff2(
    const cv::Mat& image,                  // 1. 输入图像(必须为单通道灰度图,CV_8UC1)
    cv::Point2f center,                    // 2. 测量圆心(径向线的起点)
    pair<float, float> measureRange,       // 3. 半径范围(startRadius, endRadius),在该范围内检测边缘
    int startAngleDeg,                     // 4. 起始角度(度),如0°
    int endAngleDeg,                       // 5. 结束角度(度),如360°(全圆周)
    int angleStepDeg,                      // 6. 角度步长(度),控制径向线数量(如10°步长对应36条线)
    RadialCaliperDirection direction,      // 7. 测量方向:向内(从endRadius→startRadius)或向外(从startRadius→endRadius)
    Transition transition,                 // 8. 边缘类型:Positive(暗→亮)、Negative(亮→暗)、All(所有类型)
    int grayDiffThreshold,                 // 9. 灰度差阈值:判断边缘的最小灰度变化(如10表示灰度差≥10才视为边缘)
    int minConsecutive,                    // 10. 最小连续点数:需连续N个点满足灰度差条件才认定为有效边缘(抗噪声)
    vector<cv::Point2f>& edgePoints        // 11. 输出参数:存储检测到的边缘点(亚像素精度)
);

工作原理

  1. 生成径向测量线:
    以 center 为圆心,在 [startAngleDeg, endAngleDeg] 角度范围内,按 angleStepDeg 均匀生成多条径向线(如 0°、10°、20°...350°)。

2.沿径向线采样:

每条径向线上,在 measureRange 定义的半径范围内(从 startRadius 到 endRadius,方向由 direction 控制),逐点采样图像的灰度值。

3.灰度差分检测边缘:

对采样的灰度值序列计算相邻点的灰度差,当差值超过 grayDiffThreshold 且符合 transition 定义的边缘类型(如暗→亮),且连续 minConsecutive 个点满足条件时,判定为有效边缘,记录该位置的坐标

  1. 收集结果:

所有径向线上检测到的边缘点存入 edgePoints,用于后续圆拟合(如计算真实圆心和半径)

高斯滤波,双边滤波

  • 高斯滤波:

    属于低通滤波,结果就是图片会边糊

    原因:只考虑了距离,对跃变的区域会有损失

  • 双边滤波:

  • 属于边缘保护,它既考虑了距离又考虑了权重,结果是图片像磨皮处理

cpp 复制代码
void cv::bilateralFilter(
    InputArray src,        // 输入图像
    OutputArray dst,       // 输出图像(滤波后结果)
    int d,                 // 像素邻域直径
    double sigmaColor,     // 颜色空间标准差
    double sigmaSpace,     // 坐标空间标准差
    int borderType = BORDER_DEFAULT  // 边界填充方式(默认即可)
);

建立坐标系

有了2个圆的圆心后,以2点连线为x轴,中点为原点,2点的方向向量为x轴的方向

有了x轴的方向向量(x,y)后,顺时针旋转x轴变负,即(-x,y),逆时针即(x,-y)

有了x,y轴的方向后,就可以求我们要检测的点在新坐标系的坐标,即算该点在新坐标系上的投影

  1. 将测量点转换为相对原点的向量,求测量点距离坐标轴的距离,即测量点减原点坐标,得到

    double px = p3.x - origin.x;

    double py = p3.y - origin.y;

  2. 投影到新坐标系,即坐标乘相关坐标轴的单位向量

    float localX = static_cast(px * ux + py * uy);

    float localY = static_cast(px * vx + py * vy);

cpp 复制代码
cv::Point2f TransformToMidlineCoordinates(cv::Point2f p1, cv::Point2f p2, cv::Point2f p3){
    // 计算中点作为新原点
    cv::Point2f origin((p1.x + p2.x) / 2.0f, (p1.y + p2.y) / 2.0f);

    // 新x轴方向向量
    double dx = p2.x - p1.x;
    double dy = p2.y - p1.y;
    double length = sqrt(dx * dx + dy * dy);
    double ux = dx / length;
    double uy = dy / length;

    // 新y轴方向向量
    double vx = -uy;
    double vy = ux;

    // 将p3转换为相对原点的向量
    double px = p3.x - origin.x;
    double py = p3.y - origin.y;

    // 投影到新坐标系
    float localX = static_cast<float>(px * ux + py * uy);
    float localY = static_cast<float>(px * vx + py * vy);

    return cv::Point2f(localX, localY);
}
相关推荐
Z***25801 小时前
Java计算机视觉
java·开发语言·计算机视觉
qy-ll1 小时前
最新MMO-IG生成图像论文学习(25/11/19)
图像处理·深度学习·学习·计算机视觉·论文学习·遥感
Coovally AI模型快速验证1 小时前
基于SimCLR的自监督 YOLO:YOLOv5/8也能在低标注场景目标检测性能飙升
人工智能·科技·yolo·目标检测·机器学习·计算机视觉
PHOSKEY4 小时前
光子精密QM系列闪测仪如何实现VR注塑外壳大型面平面度的秒级检测
机器学习·计算机视觉
小小工匠7 小时前
LLM - 大模型与计算机视觉融合:Skyvern核心技术架构揭秘
计算机视觉·大模型·skyvern
AI即插即用9 小时前
即插即用系列 | 2024 SOTA LAM-YOLO : 无人机小目标检测模型
pytorch·深度学习·yolo·目标检测·计算机视觉·视觉检测·无人机
walnut_oyb10 小时前
arXiv|SARLANG-1M:用于 SAR 图像理解的视觉-语言建模基准
论文阅读·人工智能·机器学习·计算机视觉·语言模型·自然语言处理
AndrewHZ12 小时前
【图像处理基石】如何入门图像配准算法?
图像处理·opencv·算法·计算机视觉·cv·图像配准·特征描述子
Dev7z14 小时前
让阅卷不再繁琐:图像识别与数据分析提升智能答题卡评分效率
人工智能·计算机视觉