C++OpencvPCB板子引脚缺陷检测

利用OpenCV的图像预处理和轮廓提取,通过对PCB板引脚的区域生长和掩膜图像处理,检测引脚总数、形心坐标、面积等,判断是否存在引脚缺失、位置偏移和高度偏移等缺陷。通过引脚ROI的排序和拟合,确定芯片中心坐标和旋转角度。

首先感谢杉木~,若侵权,请联系删除。
论文里面提出利用区域生长法获取引脚的总数及各个引脚主体部分的形心坐标及面积。通过与实际引脚总数进行对比, 判断是否存在引脚缺失的缺陷, 并和实际引脚的间距、面积的设定值进行对比, 当测定值超过设定值一定范围时, 认为该芯片存在引脚位置偏移以及高度偏移等缺陷。
与作者不同之处在于我使用提取轮廓,构建掩膜图像的方式获取引脚的主体部分,其余部分均按照论文思路判别缺陷。
步骤:

  1. 图像预处理;
  2. 提取轮廓,构建掩膜图像,获取引脚主体;
  3. 引脚分割为4个ROI,排序,获取引脚质心;
  4. 通过引脚数目 ,面积,质心间距指标分别判别缺脚,高度偏移,位置偏移;
  5. 通过拟合4个ROI内引脚质心,获取4线方程,从而获取芯片中心坐标,即可获得相对参考坐标的偏移量;
  6. 选择上下两线的斜率平均值,即可获取芯片的旋转量
void find(Mat &src, vector<vector<Point>>con_new) {
	int num = con_new.size();
	cout << "num = " << num << endl;
	//缺脚判断
	vector<Moments>mu(con_new.size());
	vector<Point2f>mc(con_new.size());
	double area = 0;
	if (num == 12) {
		//偏移判断
		for (int i = 0; i < con_new.size(); i++) {
			
<think> 我们讨论的是PCB板上带PIN针的元器件的PIN针右偏移检测问题。这是一个机器视觉或自动光学检测(AOI)领域的问题。以下是一些可能的检测方法: 1. **模板匹配(Template Matching)**:通过将标准元器件的图像作为模板,与待检测的元器件图像进行匹配,从而检测出偏移。 2. **边缘检测(Edge Detection)**:检测PIN针的边缘,通过计算边缘位置与标准位置的偏差来判断是否偏移。 3. **特征点匹配(Feature Point Matching)**:提取PIN针的特征点(如角点),然后与标准位置的特征点进行匹配,计算偏移量。 4. **霍夫变换(Hough Transform)**:如果PIN针是直线状的,可以使用霍夫变换检测直线,然后计算直线的位置偏移。 5. **形态学操作(Morphological Operations)**:通过形态学处理,如腐蚀、膨胀等,将PIN针与背景分离,然后通过计算重心或边界框位置来检测偏移。 6. **机器学习方法(Machine Learning)**:使用训练好的分类器或目标检测模型(如YOLO, SSD)来定位PIN针并检测偏移。 由于我们通常是在自动光学检测系统中实现,这里我们以边缘检测为例,给出一个简单的图像处理流程,使用OpenCV库(Python)来实现。 假设我们有一个参考图像(标准位置)和待检测图像。我们可以通过以下步骤检测右偏移: 步骤: 1. 读取参考图像和待检测图像。 2. 对两幅图像进行预处理(灰度化、滤波、二值化等)。 3. 使用边缘检测算法(如Canny)获取边缘。 4. 在参考图像中确定一个ROI(Region of Interest,感兴趣区域)作为标准位置。 5. 在待检测图像中寻找对应的ROI区域(可以通过模板匹配或特征匹配来定位元器件)。 6. 在ROI区域内,检测PIN针的边缘,计算参考图像和待检测图像中PIN针边缘的位置(如x坐标平均值)。 7. 计算位置偏移量,如果偏移量超过阈值,则判断为偏移。 下面是一个简化的示例代码,用于检测单个PIN针的偏移(假设我们已经定位到元器件的区域,并且PIN针是竖直的,我们只关心水平方向的偏移): </think>### PCB板上带PIN针元器件的PIN针右偏移检测方法 针对PCB板上带PIN针元器件的PIN针右偏移检测,以下是几种有效的机器视觉检测方法及其实现原理: --- #### 1. **模板匹配法(Template Matching)** **原理**:通过对比实际图像与标准模板图像的差异来检测偏移 **实现步骤**: 1. 创建标准PIN针位置的模板图像 2. 在实际图像中搜索匹配区域 3. 计算匹配区域与标准位置的偏移量 4. 判断偏移是否超过阈值 ```python import cv2 import numpy as np # 读取图像和模板 img = cv2.imread('pcb_image.jpg', 0) template = cv2.imread('pin_template.jpg', 0) # 模板匹配 result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) # 计算偏移量 standard_position = (100, 50) # 标准位置坐标 detected_position = max_loc # 检测到的位置 x_offset = detected_position[0] - standard_position[0] # 判断右偏移 threshold = 5 # 允许偏移阈值(像素) if x_offset > threshold: print(f"右偏移警告: 偏移量 {x_offset} 像素") # 在图像上标记偏移 cv2.rectangle(img, detected_position, (detected_position[0] + template.shape[1], detected_position[1] + template.shape[0]), (0, 0, 255), 2) cv2.imwrite('result.jpg', img) ``` --- #### 2. **边缘检测+位置计算法** **原理**:通过边缘检测定位PIN针边界,计算中心位置 **实现步骤**: 1. 使用Canny算法检测边缘 2. 通过霍夫变换检测直线边界 3. 计算PIN针中心坐标 4. 与标准位置对比 ```python import cv2 import numpy as np img = cv2.imread('pcb_image.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 边缘检测 edges = cv2.Canny(gray, 50, 150) # 霍夫直线检测 lines = cv2.HoughLinesP(edges, 1, np.pi/180, 50, minLineLength=50, maxLineGap=10) # 计算PIN针边界 left_boundary = min(line[0][0] for line in lines) right_boundary = max(line[0][2] for line in lines) pin_center = (left_boundary + right_boundary) // 2 # 判断右偏移 standard_center = 100 # 标准中心X坐标 if pin_center > standard_center + 5: # 5像素阈值 offset = pin_center - standard_center print(f"右偏移检测: 偏移量 {offset} 像素") # 可视化标记 cv2.line(img, (standard_center, 50), (standard_center, 150), (0, 255, 0), 2) cv2.line(img, (pin_center, 50), (pin_center, 150), (0, 0, 255), 2) cv2.imwrite('offset_result.jpg', img) ``` --- #### 3. **特征点匹配法** **原理**:提取PIN针特征点并与标准位置特征点匹配 ```python import cv2 # 初始化SIFT检测器 sift = cv2.SIFT_create() # 标准图像特征 ref_img = cv2.imread('reference.jpg') kp_ref, des_ref = sift.detectAndCompute(ref_img, None) # 检测图像特征 test_img = cv2.imread('test_pcb.jpg') kp_test, des_test = sift.detectAndCompute(test_img, None) # 特征匹配 bf = cv2.BFMatcher() matches = bf.knnMatch(des_ref, des_test, k=2) # 计算偏移向量 good_matches = [] for m, n in matches: if m.distance < 0.75 * n.distance: good_matches.append(m) src_pts = np.float32([kp_ref[m.queryIdx].pt for m in good_matches]) dst_pts = np.float32([kp_test[m.trainIdx].pt for m in good_matches]) # 计算平均偏移量 x_offsets = [dst[0] - src[0] for src, dst in zip(src_pts, dst_pts)] avg_offset = np.mean(x_offsets) if avg_offset > threshold: print(f"特征点检测到右偏移: {avg_offset:.2f} 像素") ``` --- #### 4. **深度学习方法(YOLO示例)** **原理**:使用目标检测模型直接定位PIN针并计算偏移 ```python import torch from PIL import Image # 加载预训练模型 model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # 推理 img = Image.open('pcb.jpg') results = model(img) # 解析结果 detections = results.pandas().xyxy[0] pin_detections = detections[detections['name'] == 'pin'] # 计算偏移 for _, det in pin_detections.iterrows(): pin_center_x = (det['xmin'] + det['xmax']) / 2 offset = pin_center_x - standard_x_position if offset > threshold: print(f"PIN针 {det['name']} 右偏移 {offset} 像素") # 可添加可视化标记代码 ``` --- ### 选择建议 1. **精度要求高**:首选边缘检测+霍夫变换(精度可达0.1mm) 2. **速度要求高**:模板匹配法(适用于固定位置元件) 3. **复杂背景**:深度学习方法(抗干扰能力强) 4. **三维偏移检测**:需使用3D AOI或X-ray检测 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI炮灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值