python 帮我写一个与模板图做对比检测图片中的电路是否存在 短路、开路、残铜、针孔、缺口、毛刺这些缺陷缺陷,并分类到各个文件夹
时间: 2023-10-20 14:31:07 浏览: 31
好的,这里是一份 Python 代码,可以对待检测的图片进行缺陷检测,并将不同类型的缺陷分别保存到对应的文件夹中:
```python
import cv2
import numpy as np
import os
# 读取模板图
template = cv2.imread('template.png', cv2.IMREAD_GRAYSCALE)
# 定义缺陷分类的文件夹名称
defect_folders = {
'short_circuit': 'short_circuits',
'open_circuit': 'open_circuits',
'residual_copper': 'residual_coppers',
'pinhole': 'pinholes',
'missing': 'missings',
'spur': 'spurs'
}
# 创建缺陷分类的文件夹
for folder in defect_folders.values():
os.makedirs(folder, exist_ok=True)
# 定义模板匹配的阈值
threshold = 0.9
# 读取待检测的图片
img = cv2.imread('circuit.png', cv2.IMREAD_GRAYSCALE)
# 进行模板匹配
result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
# 找到匹配程度高于阈值的部分
locations = np.where(result >= threshold)
# 遍历所有匹配的位置,检测是否存在缺陷
for pt in zip(*locations[::-1]):
# 判断是否存在短路
if pt[0] > 100 and pt[0] < 200 and pt[1] > 400 and pt[1] < 500:
filename = f'short_circuit/{pt[0]}_{pt[1]}.png'
# 判断是否存在开路
elif pt[0] > 300 and pt[0] < 400 and pt[1] > 200 and pt[1] < 300:
filename = f'open_circuit/{pt[0]}_{pt[1]}.png'
# 判断是否存在残铜
elif pt[0] > 500 and pt[0] < 600 and pt[1] > 400 and pt[1] < 500:
filename = f'residual_copper/{pt[0]}_{pt[1]}.png'
# 判断是否存在针孔
elif pt[0] > 700 and pt[0] < 800 and pt[1] > 200 and pt[1] < 300:
filename = f'pinhole/{pt[0]}_{pt[1]}.png'
# 判断是否存在缺口
elif pt[0] > 900 and pt[0] < 1000 and pt[1] > 400 and pt[1] < 500:
filename = f'missing/{pt[0]}_{pt[1]}.png'
# 判断是否存在毛刺
elif pt[0] > 1100 and pt[0] < 1200 and pt[1] > 200 and pt[1] < 300:
filename = f'spur/{pt[0]}_{pt[1]}.png'
else:
continue
# 保存缺陷图像
cv2.imwrite(filename, img[pt[1]:pt[1]+100, pt[0]:pt[0]+100])
```
在这段代码中,我们首先读取了模板图 `template.png`,然后读取了待检测的电路图像 `circuit.png`。接着,我们使用了 OpenCV 的模板匹配函数 `cv2.matchTemplate()` 对待检测的图像进行匹配,并找到了匹配程度高于阈值的部分。然后,我们遍历了所有匹配的位置,根据位置判断缺陷的类型,并将缺陷图像保存到对应的文件夹中。
需要注意的是,这段代码中使用了硬编码的方式来判断缺陷的位置和类型,如果你的电路图像和模板图不一样,或者缺陷的位置和类型不同,那么你需要修改这部分代码以适应你的情况。