Как собрать значения кортежа в операторе if?

У меня есть код, который состоит из if заявление в for цикл, как показано ниже,

for i in range(len(contours)):

    x, y, w, h = cv2.boundingRect(contours[i])
    mask[y:y+w, x:x+w] = 0
    cv2.drawContours(mask, contours, i, (255, 255, 255), -1)
    r = float(cv2.countNonZero(mask[y:y+h, x:x+w])) / (w * h)

    if r > 0.5 and w > 8 and h > 8:
        cv2.rectangle(rgb, (x, y), (x+w, y+h), (255, 255, 255), -1)
        cv2.circle(rgb, (x+w/2,y+h/2), 3, (180, 25, 20), -1)
        start_target_states = x+w/2 , y+h/2
        print "start_target_states: %s" % (start_target_states,)

при запуске этого кода это выглядит так, как показано ниже;

start_target_states: (704, 463)
start_target_states: (83, 15)

Тем не мение, start_target_states переменная должна быть названа как start_state для первого результата, впоследствии, он должен быть назван как target_state за второй результат. Например;

target_state: (704, 463)
start_state: (83, 15)

Более того, я хочу присвоить этим двум кортежам имя переменной. Так что я могу использовать их позже. Я имею в виду,

TargetState = target_state
StartState = start_state

Я пытался изменить заявление, чтобы достичь своей цели, к сожалению, я не смог добиться успеха. Как я могу делать то, что я хочу?

1 ответ

Решение

Если вам нужно получить к ним доступ позже, вы можете просто добавить их в список.

states = []
for i in range(len(contours)):

    x, y, w, h = cv2.boundingRect(contours[i])
    mask[y:y+w, x:x+w] = 0
    cv2.drawContours(mask, contours, i, (255, 255, 255), -1)
    r = float(cv2.countNonZero(mask[y:y+h, x:x+w])) / (w * h)

    if r > 0.5 and w > 8 and h > 8:
        cv2.rectangle(rgb, (x, y), (x+w, y+h), (255, 255, 255), -1)
        cv2.circle(rgb, (x+w/2,y+h/2), 3, (180, 25, 20), -1)
        start_target_states = x+w/2 , y+h/2
        states.append(start_target_states)
        print "start_target_states: %s" % (start_target_states,)

Поскольку у вас есть их в списке, вы все равно можете получить к ним доступ, потому что вы не переопределяете их каждый раз.

target_state = states[0]
start_state = states[1]

или, в общем, если вы хотите захватить первое и последнее:

target_state = states[0]
start_state = states[-1]

Кроме того, это не то, о чем вы спрашивали, но лучше использовать enumerate для такого рода петли.

for i, contour in enumerate(contours):

а потом вместо использования counters[i] Вы можете просто использовать contour,

Другие вопросы по тегам