【问题标题】:Segmentation of a geometrical shapes几何形状的分割
【发布时间】:2017-02-14 15:22:31
【问题描述】:

我正在尝试在 PCB 的 X 射线图像上分割 QFN 封装。 QNF封装的一般描述是它的中心是正方形或矩形,边缘是矩形引脚。示例在此图像上:

我可以很好地分割 X 射线图像上的矩形,但我不知道如何编写仅分割 QFN 包的条件。封装可以是正方形或长方形,边缘可以有不同数量的引脚。我的想法是检查每个矩形的近邻,过滤掉太大的矩形,并以某种方式检查剩余的矩形是否都在周围。有更好的方法吗?或者你将如何检查大矩形是否被小矩形包围?

我正在使用 python 3.5 和 OpenCV 3.1

【问题讨论】:

    标签: opencv rectangles image-segmentation


    【解决方案1】:

    这会有点长,我会给你一些基本的技术和指南以及一些高级建议,以提高 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 2016-03-30
      • 1970-01-01
      • 2013-04-16
      相关资源
      最近更新 更多