✨ 长期致力于视觉测量、渐开线齿轮、系统标定、边缘定位、齿廓总偏差研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1基于Bertrand曲面模型的亚像素边缘定位算法针对背光源下齿轮图像的边缘特征切向平滑、法向陡峭提出一种基于Bertrand曲面模型的亚像素边缘定位方法。该算法首先采用八邻域追踪获得连续的单像素像素级边缘曲线然后在每个边缘点处建立局部法截线。将边缘附近的灰度曲面建模为以高斯积分曲线为母线、以待求亚像素边缘曲线为准线的Bertrand曲面通过拟合该曲面的参数方程直接得到亚像素边缘坐标。与传统的一维灰度矩方法相比Bertrand曲面模型同时利用了边缘切向和法向的信息在存在0.5像素高斯噪声时定位偏差的标准差从0.08像素降低到0.025像素。对模数为2mm的标准渐开线齿轮采集10幅图像该算法提取的齿廓边缘点重复性优于0.1微米而Canny算子结合抛物线拟合的重复性为0.35微米。2基于初始相位角的齿廓总偏差测量模型为了解决中小模数齿轮中心不在视野内的问题提出一种基于标定圆盘的齿轮中心定位方法。将标定圆盘与待测齿轮同轴安装在相同光学条件下采集圆盘图像使用半径约束最小二乘圆拟合算法求解圆盘圆心坐标作为齿轮中心拟合误差小于0.01像素。然后将齿廓上的测量点视为同一基圆、不同初始相位角的标准渐开线上的点建立齿廓偏差与初始相位角的映射关系。测量点集的实际展角与理论展角之差即为齿廓总偏差。该模型避免了复杂的坐标变换计算效率高。对一个5级精度标准齿轮进行10次重复测量齿廓总偏差Fα的测量平均值为4.6微米标准差为0.12微米与齿轮测量中心的结果4.5微米非常接近。3系统标定与误差补偿模型建立包含镜头畸变、光源强度漂移和像素当量的综合标定模型。采用点阵标定板通过检测每个标定圆圆心的图像坐标与物理坐标建立三阶径向畸变和二阶离心畸变的非线性优化模型。像素当量采用标定板上相邻圆心距的物理尺寸与像素尺寸之比确定采用多对距离的平均值降低随机误差。此外针对不同光源强度下边缘位置偏移的问题建立光源强度-边缘偏移补偿曲线当光源强度从50%变化到90%时边缘偏移量呈负指数变化最大偏移可达0.6像素。补偿模型将光源强度作为输入动态修正边缘坐标。补偿后在光源强度波动20%的情况下齿廓总偏差测量值的变化量从0.8微米降至0.1微米。利用量块验证系统精度在10mm长度范围内测量误差最大为1.2微米满足5级齿轮的测量要求。import cv2 import numpy as np from scipy.optimize import least_squares class BertrandEdgeModel: def __init__(self, img_gray): self.img img_gray def subpixel_edge(self, x0, y0): # 沿法线方向采样 normal_angle self.compute_normal(x0, y0) xs np.arange(-5, 6) ys xs * np.tan(normal_angle) intensity [self.img[int(round(y0dy)), int(round(x0dx))] for dx,dy in zip(xs, ys)] # 拟合高斯积分曲线 from scipy.optimize import curve_fit def gauss_integral(x, mu, sigma, A, B): return A * (0.5*(1np.exp((x-mu)/(sigma*np.sqrt(2))))) B popt, _ curve_fit(gauss_integral, xs, intensity, p0[0,1,255,0]) return x0 popt[0]*np.cos(normal_angle), y0 popt[0]*np.sin(normal_angle) def compute_normal(self, x, y): # 利用Sobel算子求梯度方向 grad_x cv2.Sobel(self.img, cv2.CV_64F, 1, 0, ksize3) grad_y cv2.Sobel(self.img, cv2.CV_64F, 0, 1, ksize3) angle np.arctan2(grad_y[int(y), int(x)], grad_x[int(y), int(x)]) return angle np.pi/2 def gear_center_calibration(circle_img, known_radius_mm, pixel_per_mm_est): circles cv2.HoughCircles(circle_img, cv2.HOUGH_GRADIENT, 1, 50, param150, param230) circles np.round(circles[0, :]).astype(int) def radius_error(params): cx, cy params radii [np.hypot(cx-x, cy-y) for x,y,r in circles] return [r - known_radius_mm * pixel_per_mm_est for r in radii] result least_squares(radius_error, x0[circle_img.shape[1]/2, circle_img.shape[0]/2]) return result.x def tooth_profile_deviation(edge_points, base_radius, start_angle): errors [] for (x,y) in edge_points: angle np.arctan2(y, x) r np.hypot(x, y) involute_angle np.sqrt((r/base_radius)**2 - 1) - np.arccos(base_radius/r) errors.append((angle - start_angle) - involute_angle) return np.max(errors) - np.min(errors)
齿轮视觉测量系统与齿廓测量技术解析【附数据】
✨ 长期致力于视觉测量、渐开线齿轮、系统标定、边缘定位、齿廓总偏差研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1基于Bertrand曲面模型的亚像素边缘定位算法针对背光源下齿轮图像的边缘特征切向平滑、法向陡峭提出一种基于Bertrand曲面模型的亚像素边缘定位方法。该算法首先采用八邻域追踪获得连续的单像素像素级边缘曲线然后在每个边缘点处建立局部法截线。将边缘附近的灰度曲面建模为以高斯积分曲线为母线、以待求亚像素边缘曲线为准线的Bertrand曲面通过拟合该曲面的参数方程直接得到亚像素边缘坐标。与传统的一维灰度矩方法相比Bertrand曲面模型同时利用了边缘切向和法向的信息在存在0.5像素高斯噪声时定位偏差的标准差从0.08像素降低到0.025像素。对模数为2mm的标准渐开线齿轮采集10幅图像该算法提取的齿廓边缘点重复性优于0.1微米而Canny算子结合抛物线拟合的重复性为0.35微米。2基于初始相位角的齿廓总偏差测量模型为了解决中小模数齿轮中心不在视野内的问题提出一种基于标定圆盘的齿轮中心定位方法。将标定圆盘与待测齿轮同轴安装在相同光学条件下采集圆盘图像使用半径约束最小二乘圆拟合算法求解圆盘圆心坐标作为齿轮中心拟合误差小于0.01像素。然后将齿廓上的测量点视为同一基圆、不同初始相位角的标准渐开线上的点建立齿廓偏差与初始相位角的映射关系。测量点集的实际展角与理论展角之差即为齿廓总偏差。该模型避免了复杂的坐标变换计算效率高。对一个5级精度标准齿轮进行10次重复测量齿廓总偏差Fα的测量平均值为4.6微米标准差为0.12微米与齿轮测量中心的结果4.5微米非常接近。3系统标定与误差补偿模型建立包含镜头畸变、光源强度漂移和像素当量的综合标定模型。采用点阵标定板通过检测每个标定圆圆心的图像坐标与物理坐标建立三阶径向畸变和二阶离心畸变的非线性优化模型。像素当量采用标定板上相邻圆心距的物理尺寸与像素尺寸之比确定采用多对距离的平均值降低随机误差。此外针对不同光源强度下边缘位置偏移的问题建立光源强度-边缘偏移补偿曲线当光源强度从50%变化到90%时边缘偏移量呈负指数变化最大偏移可达0.6像素。补偿模型将光源强度作为输入动态修正边缘坐标。补偿后在光源强度波动20%的情况下齿廓总偏差测量值的变化量从0.8微米降至0.1微米。利用量块验证系统精度在10mm长度范围内测量误差最大为1.2微米满足5级齿轮的测量要求。import cv2 import numpy as np from scipy.optimize import least_squares class BertrandEdgeModel: def __init__(self, img_gray): self.img img_gray def subpixel_edge(self, x0, y0): # 沿法线方向采样 normal_angle self.compute_normal(x0, y0) xs np.arange(-5, 6) ys xs * np.tan(normal_angle) intensity [self.img[int(round(y0dy)), int(round(x0dx))] for dx,dy in zip(xs, ys)] # 拟合高斯积分曲线 from scipy.optimize import curve_fit def gauss_integral(x, mu, sigma, A, B): return A * (0.5*(1np.exp((x-mu)/(sigma*np.sqrt(2))))) B popt, _ curve_fit(gauss_integral, xs, intensity, p0[0,1,255,0]) return x0 popt[0]*np.cos(normal_angle), y0 popt[0]*np.sin(normal_angle) def compute_normal(self, x, y): # 利用Sobel算子求梯度方向 grad_x cv2.Sobel(self.img, cv2.CV_64F, 1, 0, ksize3) grad_y cv2.Sobel(self.img, cv2.CV_64F, 0, 1, ksize3) angle np.arctan2(grad_y[int(y), int(x)], grad_x[int(y), int(x)]) return angle np.pi/2 def gear_center_calibration(circle_img, known_radius_mm, pixel_per_mm_est): circles cv2.HoughCircles(circle_img, cv2.HOUGH_GRADIENT, 1, 50, param150, param230) circles np.round(circles[0, :]).astype(int) def radius_error(params): cx, cy params radii [np.hypot(cx-x, cy-y) for x,y,r in circles] return [r - known_radius_mm * pixel_per_mm_est for r in radii] result least_squares(radius_error, x0[circle_img.shape[1]/2, circle_img.shape[0]/2]) return result.x def tooth_profile_deviation(edge_points, base_radius, start_angle): errors [] for (x,y) in edge_points: angle np.arctan2(y, x) r np.hypot(x, y) involute_angle np.sqrt((r/base_radius)**2 - 1) - np.arccos(base_radius/r) errors.append((angle - start_angle) - involute_angle) return np.max(errors) - np.min(errors)