编写一段代码,实现基于opencv python实现PCB板上的针点检测,要求针点范围在对应测试点的60%区域内,否则判定为不合规
时间: 2024-03-28 07:37:06 浏览: 151
以下是一个基于OpenCV Python的示例代码,用于实现PCB板上的针点检测,并根据测试点的60%区域内是否存在针点来判断是否合规:
```python
import cv2
import numpy as np
# 读取原始图像
img = cv2.imread('pcb_image.png')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 对图像进行二值化处理
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# 对二值图像进行形态学处理,去除噪点并增强针点的连通性
kernel = np.ones((5,5), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel, iterations=1)
# 查找轮廓
contours, hierarchy = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 遍历轮廓,找到符合要求的针点
for contour in contours:
# 计算当前轮廓的最小外接圆和最小外接矩形
(x,y), radius = cv2.minEnclosingCircle(contour)
center = (int(x),int(y))
radius = int(radius)
rect = cv2.minAreaRect(contour)
# 计算测试点区域的大小和位置
test_point_x = 200 # 测试点的x坐标
test_point_y = 300 # 测试点的y坐标
test_point_radius = 30 # 测试点的半径
test_point_area = np.pi * test_point_radius * test_point_radius # 测试点的面积
test_point_rect = (test_point_x - 0.6 * test_point_radius, test_point_y - 0.6 * test_point_radius, 1.2 * test_point_radius, 1.2 * test_point_radius)
# 判断当前针点是否在测试点区域内
if cv2.pointPolygonTest(contour, (test_point_x, test_point_y), True) >= 0:
# 计算针点区域的大小和位置
needle_area = np.pi * radius * radius
needle_rect = (x - radius, y - radius, 2 * radius, 2 * radius)
# 判断针点是否在测试点的60%区域内
intersection = (min(needle_rect[0] + needle_rect[2], test_point_rect[0] + test_point_rect[2]) - max(needle_rect[0], test_point_rect[0])) * (min(needle_rect[1] + needle_rect[3], test_point_rect[1] + test_point_rect[3]) - max(needle_rect[1], test_point_rect[1]))
if intersection > 0.6 * test_point_area:
print('针点检测结果:合规')
# 在原始图像上绘制针点区域和测试点区域
cv2.circle(img, center, radius, (0, 255, 0), 2)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img,[box],0,(0,0,255),2)
cv2.circle(img, (test_point_x, test_point_y), test_point_radius, (255, 0, 0), 2)
else:
print('针点检测结果:不合规')
else:
print('针点检测结果:不合规')
# 显示结果
cv2.imshow('Original Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上述代码中,我们首先读取了原始图像,然后将其转换为灰度图像,并使用cv2.threshold函数对其进行二值化处理。接着,使用形态学处理,去除噪点并增强针点的连通性。然后,使用cv2.findContours函数查找所有轮廓,并遍历每个轮廓。对于每个轮廓,我们计算其最小外接圆和最小外接矩形,并使用cv2.pointPolygonTest函数判断针点是否在测试点区域内,然后计算针点区域的大小和位置。最后,判断针点是否在测试点的60%区域内,若在,则判定为合规,否则判定为不合规,并在原始图像上绘制针点区域和测试点区域。
阅读全文