2017-02-14 89 views
1

我想在PCB的x射线图像上分割一个QFN封装。 QNF封装的一般描述是,它的正方形或矩形在中心,边上有矩形的引脚。这个例子是在这个图像:QFN package几何形状的分割

我可以细分X射线图像上的矩形相当不错,但我不知道如何编写条件来只分割QFN包。包装可以是正方形或长方形,边缘上可以有不同数量的针脚。我的想法是检查每个矩形滤波器的紧密邻域,这些矩形过大,并以某种方式检查剩余矩形是否全部。有更好的方法吗?或者,你会如何检查大矩形是否被小的包围? Real image

我使用python 3.5和OpenCV 3.1

回答

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"