我正在尝试在PCB的X射线图像上分割QFN封装。 QNF封装的一般描述是它的中心是正方形或矩形,边缘有矩形引脚。示例位于此图片上:
我可以很好地分割X射线图像上的矩形,但我不知道如何编写条件来仅分割QFN包。封装可以是方形或矩形,边缘上可以有不同数量的引脚。我的想法是检查每个矩形的近邻过滤掉过大的矩形,并以某种方式检查剩下的矩形是否全部都在。有更好的方法吗?或者你如何检查大矩形是否被小的矩形包围?
我正在使用python 3.5和OpenCV 3.1
答案 0 :(得分:0)
这将会有点长,我会给你一些基本的技术和指南,以及一些提高QNF包检测准确性的高级建议。
假设您已将红色标记的轮廓存储在变量contours
中。
首先定义要过滤的轮廓区域的上限和下限。根据给定的图像,中心区域的区域范围是:
CHIP_CENTER_AREA_LOWER, CHIP_CENTER_AREA_UPPER = 20*1000, 25*1000
因此,我们迭代所有轮廓并过滤具有上述范围的面积的轮廓,它将消除较小的轮廓,并且我们将仅检查较大的轮廓。
probable_chip_center_contour_idx = []
for i in xrange(len(contours)):
cnt = contours[i]
area = cv2.contourArea(cnt)
if CHIP_CENTER_AREA_LOWER < area < CHIP_CENTER_AREA_UPPER:
probable_chip_center_contour_idx.append(i)
现在在根据区域过滤掉可能的轮廓后,我们将检查相邻轮廓(针脚)的数量。那些预期在给定半径内预期相邻轮廓数量的中心轮廓将是最终结果。
radius = 80
EXPECTED_NEIGHBOURING_PINS = 28
for i in probable_chip_center_contour_idx:
cnt = contours[i]
cnt_bounding_rect = cv2.boundingRect(cnt)
extended_cnt_bounding_rect = [cnt_bounding_rect[0] - radius, cnt_bounding_rect[1] - radius,
cnt_bounding_rect[2] + 2*radius, cnt_bounding_rect[3] + 2*radius]
neighbouring_contours = 0
for probable_neighbouring_contour in contours:
probable_bounding_rect = cv2.boundingRect(probable_neighbouring_contour)
if is_rect_inside(probable_bounding_rect, extended_cnt_bounding_rect):
neighbouring_contours += 1
if neighbouring_contours > EXPECTED_NEIGHBOURING_PINS:
print "QFN Found"