2026/3/30 11:26:59
网站建设
项目流程
成都微信网站设计,多用户商城源码开发,智林东莞网站建设公司,营销网站的特征卡尺工具#xff0c;尺寸测量#xff0c;直线拟合#xff0c;圆拟合。卡尺工具在工业检测里挺常见的#xff0c;尤其是自动化尺寸测量的时候。比如检测零件边缘的直线度或者圆孔的直径#xff0c;这时候就得靠算法从图像里把实际尺寸抠出来。不过别以为这玩意儿简单——图…卡尺工具尺寸测量直线拟合圆拟合。卡尺工具在工业检测里挺常见的尤其是自动化尺寸测量的时候。比如检测零件边缘的直线度或者圆孔的直径这时候就得靠算法从图像里把实际尺寸抠出来。不过别以为这玩意儿简单——图像里的噪点、光照变化分分钟能让测量结果飘到姥姥家。先说怎么找边缘点。假设咱们用OpenCV处理一张零件图先灰度化再Canny边缘检测边缘点坐标就出来了。但这时候的点可能是散的得用卡尺工具沿着特定方向做搜索。比如下面这段代码模拟垂直方向上的卡尺扫描import cv2 import numpy as np def ruler_scan(img, roi_width100, step5): height, width img.shape points [] for y in range(0, height, step): roi img[y:y1, width//2 - roi_width//2 : width//2 roi_width//2] max_val np.max(roi) if max_val 128: # 简单阈值判断 x_pos np.argmax(roi) (width//2 - roi_width//2) points.append((x_pos, y)) return np.array(points)这法子虽然糙但胜在速度快。实际工业场景里可能会用亚像素边缘检测把精度提到0.1像素级别。拿到边缘点之后直线拟合就该上场了。最基础的当属最小二乘法def fit_line(points): x points[:,0] y points[:,1] A np.vstack([x, np.ones(len(x))]).T k, b np.linalg.lstsq(A, y, rcondNone)[0] return k, b但实际场景里经常遇到异常点比如工件表面的划痕被误检。这时候RANSAC算法就派上用场了。举个OpenCV的实现例子import cv2 vx, vy, x0, y0 cv2.fitLine(points, cv2.DIST_L2, 0, 0.01, 0.01) k vy / vx # 斜率 b y0 - k * x0RANSAC的核心是随机采样迭代验证代码里虽然没直接写循环但cv2.fitLine内部已经处理了异常点的问题。不过要注意当数据中有超过50%的离群点时这方法也得跪。圆拟合就更刺激了。最小二乘法的计算量直接上了一个台阶def fit_circle(points): x points[:,0] y points[:,1] A np.vstack([2*x, 2*y, np.ones(len(x))]).T b x**2 y**2 cx, cy, r np.linalg.lstsq(A, b, rcondNone)[0] r np.sqrt(r cx**2 cy**2) return (cx, cy), r这其实是把圆方程展开成线性方程组来解。不过实际用的时候会发现噪声稍大点结果就崩。所以OpenCV自带的霍夫圆检测虽然慢但鲁棒性更好circles cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 20, param150, param230, minRadius10, maxRadius100)参数调校是门玄学param2控制累加器阈值低了会有多个假圆高了可能漏检。有个骚操作是先用霍夫检测粗定位再用最小二乘法精修这样既能抗噪又保证了精度。测量系统最怕的是误差累积。曾经有个项目客户反馈测量结果每天会漂0.1mm查到最后发现是温度变化导致工业相机CMOS产生热胀冷缩。后来在算法里加了个参考物坐标系校准才解决。所以啊搞机器视觉的既要懂代码风花雪月也得明白螺丝该怎么拧。