用摄像头检测零件尺寸是否合格的Python代码

以下是一个基于OpenCV的实时零件尺寸检测Python实例代码,结合摄像头捕捉和图像处理技术实现尺寸检测。代码中包含详细的注释说明和实际应用要点。

import cv2 
import numpy as np 
 
# 初始化摄像头 
cap = cv2.VideoCapture(0)
# 设置参考物实际尺寸(示例为A4纸的短边21cm)
ref_width_cm = 21.0  
min_width = 19.5  # 最小合格尺寸 
max_width = 21.5  # 最大合格尺寸 
 
def get_pixel_ratio(frame):
    """通过参考物计算像素/厘米比例"""
    gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    edged = cv2.Canny(blurred, 50, 200)
    
    # 寻找最大轮廓 
    contours, _ = cv2.findContours(edged,  cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    if len(contours) > 0:
        max_contour = max(contours, key=cv2.contourArea) 
        x, y, w, h = cv2.boundingRect(max_contour) 
        return w / ref_width_cm  # 像素/厘米 
    return None 
 
while True:
    ret, frame = cap.read() 
    if not ret:
        break 
    
    # 获取当前像素比例 
    pixel_ratio = get_pixel_ratio(frame)
    
    if pixel_ratio is not None:
        # 预处理 
        gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)
        blurred = cv2.GaussianBlur(gray, (5, 5), 0)
        edged = cv2.Canny(blurred, 50, 200)
        
        # 检测零件轮廓 
        contours, _ = cv2.findContours(edged,  cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        for cnt in contours:
            area = cv2.contourArea(cnt) 
            if area > 1000:  # 过滤小噪点 
                # 获取旋转矩形 
                rect = cv2.minAreaRect(cnt) 
                (x, y), (w, h), angle = rect 
                
                # 计算实际尺寸 
                width_cm = max(w, h) / pixel_ratio 
                height_cm = min(w, h) / pixel_ratio 
                
                # 判断是否合格 
                color = (0, 255, 0) if (min_width <= width_cm <= max_width) else (0, 0, 255)
                
                # 绘制检测结果 
                box = cv2.boxPoints(rect) 
                box = np.int0(box) 
                cv2.drawContours(frame,  [box], 0, color, 2)
                cv2.putText(frame,  f"W:{width_cm:.1f}cm", (int(x)-50, int(y)-20),
                           cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,0,0), 2)
 
    cv2.imshow('Detection',  frame)
    if cv2.waitKey(1)  == 27:  # ESC退出 
        break 
 
cap.release() 
cv2.destroyAllWindows() 

关键实现要点说明:
参考物校准:通过A4纸等已知尺寸物体建立像素与实际尺寸的换算关系,这是实现精确测量的基础

图像预处理流程:

高斯模糊消除噪声(GaussianBlur)
Canny边缘检测获取零件轮廓(Canny)
形态学操作优化边缘质量(示例中未展示,可添加膨胀/腐蚀操作)
轮廓分析技术:

使用findContours获取候选轮廓
minAreaRect获取最小外接旋转矩形
面积过滤排除噪声干扰
实时检测优化:

保持30fps以上的处理速度
使用绿色/红色边框直观显示检测结果
显示实时尺寸数值
扩展改进建议:
增加稳定性措施:

# 在获取像素比例处添加移动平均滤波 
ratio_buffer = []
def get_pixel_ratio(frame):
    ... # 原有代码 
    if len(ratio_buffer) > 10:
        ratio_buffer.pop(0) 
    ratio_buffer.append(current_ratio) 
    return np.mean(ratio_buffer) 

光照补偿处理:

clahe = cv2.createCLAHE(clipLimit=3.0,  tileGridSize=(8,8))
gray = clahe.apply(gray) 

数据库集成(需配合SQLite等数据库):

数据库集成(需配合SQLite等数据库):
import sqlite3 
def save_result(measurement):
    conn = sqlite3.connect('quality.db') 
    c = conn.cursor() 
    c.execute('''INSERT  INTO records VALUES (?, ?, datetime('now'))''', 
             (measurement['width'], measurement['status']))
    conn.commit()

注意事项:
摄像头应垂直正对检测平面,推荐使用固定支架
参考物与零件需处于相同焦平面
建议使用环形光源消除阴影干扰
定期用标准量具校准系统精度
该方案结合了机器视觉的常见检测方法,通过实时视频流处理实现自动化检测,可扩展应用于工业质检场景。实际部署时需根据具体零件特征调整预处理参数和判定阈值。

### 工业零件尺寸测量系统的研究现状 基于OpenCV的工业零件尺寸测量系统近年来得到了广泛关注和发展。该类系统利用计算机视觉技术,能够高效精确地完成复杂环境下的尺寸检测任务。 #### 技术基础与发展历程 OpenCV作为一个开源计算机视觉库,最初由Intel研究中心开发[^1]。其强大的功能和跨平台特性使得开发者可以在多种编程环境中轻松集成复杂的图像处理算法。这为构建高效的工业零件尺寸测量系统奠定了坚实的技术基础。 #### 关键技术和特点 此类系统通常依赖于高质量的摄像头采集设备以及先进的边缘检测、轮廓提取等算法来获取待测物体的关键几何特征。具体来说: - **高分辨率成像**:选用适合工作距离和视场范围的专业级CCD或CMOS传感器; - **亚像素精度定位**:运用Harris角点检测器或其他更高级的方法实现对工件边界位置的高度精准测定; - **多视角融合计算**:当单次拍摄无法满足需求时,可通过拼接不同角度的照片获得完整的三维模型数据; 这些方法共同作用下,不仅提高了测量准确性,而且大大缩短了操作时间,降低了人工干预程度[^2]。 #### 应用场景实例分析 在实际生产线上,这类基于OpenCV搭建起来的自动化工位已经成功应用于汽车制造、电子产品组装等多个行业领域内零部件的质量控制环节当中。例如,在冲压车间里用来检验钢板厚度和平整度是否合格;或是电子厂流水线上的贴片元件间距核查等工作都离不开这一先进技术的支持。 ```python import cv2 as cv from skimage import measure def detect_contours(image_path): img = cv.imread(image_path, 0) edges = cv.Canny(img, 100, 200) contours, _ = cv.findContours(edges.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) properties = ['area', 'eccentricity'] regionprops = measure.regionprops(contours=contours, intensity_image=img, properties=properties) return regionprops ``` 上述代码展示了如何使用OpenCV读取图片并找到其中的目标对象轮廓,进而对其进行形态学属性分析的过程。这对于后续开展具体的长度宽度等方面的量化评估非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值