2016-12-01 3 views
0

Я хочу перебирать список контуров по их площади (самая высокая область до самого низкого).Python OpenCV2: упорядочение контуров и иерархия деревьев по контурной области

Я знаю, что один из способов сделать это с помощью:

_, contours, heirachy = cv2.findContours(image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 

for contour in sorted(contours, key=cv2.contourArea, reverse=True): 
    ... 

Однако то, что я хочу сделать, это получить доступ к иерархические отношения между контурами, а итерация - в лучшем случае, я хотел бы видеть, сколько контуры содержатся внутри каждого внешнего контура родителей, однако я также был бы счастлив просто найти внешние контуры, которые являются родителями для внутренних контуров.

_, contours, heirachy = cv2.findContours(image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 

for i in zip(contours, hierarchy): 
    contour = i[0] 
    relations = i[1] 
    x, y, w, h = cv2.boundingRect(contour) 

    # outer contours: 
    if relations[3] < 0: 
     # checks if it is squarish 
     if 0.85 < (w/h) < 1.1: 
      corner += 1 

    if corner == 3: 
     break 

То, что я борюсь с, в состоянии застегнуть контуры вместе, чтобы они оба могут быть доступны simultabeously, но и перебирать их от самого высокого до самого низкого области, как это сделано выше.

Обратите внимание, что целью этого является поиск трех отмеченных углов QR-кода, поэтому я хочу, чтобы можно было найти внешние контуры, а также итерацию от самой высокой области до самой низкой области, чтобы обеспечить обнаружение найденных контуров являются большими угловыми квадратами, а не меньшими квадратами в QR-коде

+0

Какой-то косвенный вид, возможно? –

+0

@ DanMašek Как бы вы посоветовали это сделать? – Ronikos

+0

Что-то по строкам 'indices = sorted (range (len (contours)), key = lambda i: cv2.contourArea (контуры [i]))' –

ответ

0

Очень новый при кодировании. Просто интересно, если отсутствует индекс?

for x, y in zip(a, b): 
    # x is from a, y is from b