Constantin Wenger
2019-06-21 f04bb007b088778457603d0e891d01358dd63e17
try to detect outer contours caused by sleeves
1 files modified
43 ■■■■■ changed files
opencv_dnn.py 43 ●●●●● patch | view | raw | blame | history
opencv_dnn.py
@@ -241,6 +241,7 @@
        #print('no contours')
        return []
    img_cont = cv2.cvtColor(img_erode, cv2.COLOR_GRAY2BGR)
    img_cont_base = img_cont.copy()
    cnts2 = sorted(cnts, key=cv2.contourArea, reverse=True)
    cnts2 = cnts2[:10]
    for i in range(0, len(cnts2)):
@@ -262,9 +263,45 @@
        size = cv2.contourArea(cnt)
        peri = cv2.arcLength(cnt, True)
        approx = cv2.approxPolyDP(cnt, 0.04 * peri, True)
        if size >= size_thresh and len(approx) < 6:
            print('Size:', size)
            cnts_rect.append(approx)
        if size >= size_thresh and len(approx) == 4:
            # lets see if we got a contour very close in size as child
            if i_child != -1:
                img_ccont = img_cont_base.copy()
                # lets collect all children
                c_list = [cnts[i_child]]
                h_info = hier[0][i_child]
                while h_info[0] != -1:
                    cld = cnts[h_info[0]]
                    c_list.append(cld)
                    h_info = hier[0][h_info[0]]
                # child with biggest area
                c_list.sort(key=cv2.contourArea, reverse=True)
                c_cnt = c_list[0]  # the biggest child
                cv2.drawContours(img_ccont, c_list[:1], -1, (0, 255, 0), 1)
                cv2.imshow('CCont %d' % i_cnt, img_ccont)
                c_size = cv2.contourArea(c_cnt)
                c_approx = cv2.approxPolyDP(c_cnt, 0.04 * peri, True)
                if len(c_approx) == 4 and (c_size/size) > 0.85:
                    rect = cv2.minAreaRect(c_cnt)
                    box = cv2.boxPoints(rect)
                    box = np.intp(box)
                    print(c_cnt)
                    print(box)
                    print('CSize:', c_size, '%:', c_size/size)
                    b2 = []
                    for x in box:
                        b2.append([x])
                    cnts_rect.append(np.array(b2))
                else:
                    print('CF:', (c_size/size))
                    print('Size:', size)
                    cnts_rect.append(approx)
            else:
                print('CF:', (c_size/size))
                print('Size:', size)
                cnts_rect.append(approx)
        else:
            if i_child != -1:
                stack.append((i_child, hier[0][i_child]))