Это будет немного долго, я хотел бы дать вам некоторые основные методы и принципы, а также некоторые дополнительные предложения, чтобы повысить точность обнаружения пакета 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"