Как увеличить целое число на 1 с каждым циклом массиваPython

Программы на Python
Ответить
Anonymous
 Как увеличить целое число на 1 с каждым циклом массива

Сообщение Anonymous »

Извините, если название вводит в заблуждение или неточно.

Я новичок в программировании и этой терминологии...

Контекст:
Отслеживание ключевых точек рук в Mediapipe
Выполнение расчета расстояний между кончиками пальцев (всего 8 значений)
Это работает хорошо и хорошо!

Код: Выделить всё

import mediapipe as mp
import cv2
import numpy as np
import rtmidi

out = rtmidi.MidiOut()

mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands

#Distance between Fingertips & MIDI Out
point_list = [[4,8],[8,12],[12,16],[16,20]]

def draw_tip_distances(image, results, point_list):
# Loop through hands
for hand in results.multi_hand_landmarks:
#Loop through point sets
for point in point_list:
a = np.array([hand.landmark[point[0]].x, hand.landmark[point[0]].y]) # First coord
b = np.array([hand.landmark[point[1]].x, hand.landmark[point[1]].y]) # Second coord

dist = np.linalg.norm((a-b)*2.5)
if dist > 1:
dist = 1
if dist < 0.08:
dist = 0

cc_msg = [0xB0, 1, round(dist*127,0)]
out.send_message(cc_msg)
print(cc_msg)

cv2.putText(image, str(round(dist, 2)), tuple(np.multiply(b, [640, 480]).astype(int)),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
return image

Текущий вывод:

Где: [MIDI-канал, канал устройства, значение]

Код: Выделить всё

`
[176, 1, 57.0]
[176, 1, 14.0]
[176, 1, 0]
[176, 1, 25.0]
[176, 1, 70.0]
[176, 1, 21.0]
[176, 1, 12.0]
[176, 1, 24.0]`
Проблема:

Код: Выделить всё

cc_msg = [0xB0, 1, round(dist*127,0)]
out.send_message(cc_msg)
print(cc_msg)
все 8 значений расстояния отправляются в один и тот же канал устройства (=1)

Желаемый результат:

Код: Выделить всё

`
[176, 1, 57.0]
[176, 2, 14.0]
[176, 3, 0]
[176, 4, 25.0]
[176, 5, 70.0]
[176, 6, 21.0]
[176, 7, 12.0]
[176, 8, 24.0]`
Я попробовал несколько разных вещей:
1 — цикл по «точке»

Код: Выделить всё

cc_msg = [0xB0, point[0], round(dist*127,0)]
out.send_message(cc_msg)
print(cc_msg)

Вывод:

Код: Выделить всё

[176, 4, 61.0]
[176, 8, 19.0]
[176, 12, 18.0]
[176, 16, 25.0]
[176, 4, 79.0]
[176, 8, 25.0]
[176, 12, 19.0]
[176, 16, 25.0]
2 – Добавление списка каналов для циклического просмотра

Код: Выделить всё

#MIDI Channels
ch_list = [[1],[2],[3],[4],[5],[6],[7],[8]]

#Distance between Fingertips & MIDI Out
point_list = [[4,8],[8,12],[12,16],[16,20]]

def draw_tip_distances(image, results, point_list):
# Loop through hands
for hand in results.multi_hand_landmarks:
for ch in ch_list:
#Loop through point sets
for point in point_list:
a = np.array([hand.landmark[point[0]].x, hand.landmark[point[0]].y]) # First coord
b = np.array([hand.landmark[point[1]].x, hand.landmark[point[1]].y]) # Second coord

dist = np.linalg.norm((a-b)*2.5)
if dist > 1:
dist = 1
if dist <  0.08:
dist = 0

cc_msg = [0xB0, ch[0], round(dist*127,0)]
out.send_message(cc_msg)
print(cc_msg)

cv2.putText(image, str(round(dist, 2)), tuple(np.multiply(b, [640, 480]).astype(int)),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
return image

Вывод:

каждое значение dist сопоставляется с каждым каналом...

Код: Выделить всё

[176, 1, 78.0]
[176, 1, 31.0]
[176, 1, 20.0]
[176, 1, 36.0]
[176, 2, 78.0]
[176, 2, 31.0]
[176, 2, 20.0]
[176, 2, 36.0]
[176, 3, 78.0]
[176, 3, 31.0]
[176, 3, 20.0]
[176, 3, 36.0]
[176, 4, 78.0]
[176, 4, 31.0]
[176, 4, 20.0]
[176, 4, 36.0]
[176, 5, 78.0]
[176, 5, 31.0]
[176, 5, 20.0]
[176, 5, 36.0]
[176, 6, 78.0]
[176, 6, 31.0]
[176, 6, 20.0]
[176, 6, 36.0]
[176, 7, 78.0]
[176, 7, 31.0]
[176, 7, 20.0]
[176, 7, 36.0]
[176, 8, 78.0]
[176, 8, 31.0]
[176, 8, 20.0]
[176, 8, 36.0]
[176, 1, 85.0]
[176, 1, 33.0]
[176, 1, 23.0]
[176, 1, 32.0]
[176, 2, 85.0]
[176, 2, 33.0]
[176, 2, 23.0]
[176, 2, 32.0]
[176, 3, 85.0]
[176, 3, 33.0]
[176, 3, 23.0]
[176, 3, 32.0]
[176, 4, 85.0]
[176, 4, 33.0]
[176, 4, 23.0]
[176, 4, 32.0]
[176, 5, 85.0]
[176, 5, 33.0]
[176, 5, 23.0]
[176, 5, 32.0]
[176, 6, 85.0]
[176, 6, 33.0]
[176, 6, 23.0]
[176, 6, 32.0]
[176, 7, 85.0]
[176, 7, 33.0]
[176, 7, 23.0]
[176, 7, 32.0]
[176, 8, 85.0]
[176, 8, 33.0]
[176, 8, 23.0]
[176, 8, 32.0]
3 — Вложенный цикл каналов

Код: Выделить всё

def draw_tip_distances(image, results, point_list):
# Loop through hands
for hand in results.multi_hand_landmarks:
#Loop through point sets
for point in point_list:
a = np.array([hand.landmark[point[0]].x, hand.landmark[point[0]].y]) # First coord
b = np.array([hand.landmark[point[1]].x, hand.landmark[point[1]].y]) # Second coord

dist = np.linalg.norm((a-b)*2.5)
if dist > 1:
dist = 1
if dist <  0.08:
dist = 0

for ch in ch_list:
cc_msg = [0xB0, ch[0], round(dist*127,0)]
out.send_message(cc_msg)
print(cc_msg)

cv2.putText(image, str(round(dist, 2)), tuple(np.multiply(b, [640, 480]).astype(int)),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
return image

Вывод:

каждое значение, присвоенное каждому каналу...

Код: Выделить всё

[176, 1, 85.0]
[176, 2, 85.0]
[176, 3, 85.0]
[176, 4, 85.0]
[176, 5, 85.0]
[176, 6, 85.0]
[176, 7, 85.0]
[176, 8, 85.0]
[176, 1, 33.0]
[176, 2, 33.0]
[176, 3, 33.0]
[176, 4, 33.0]
[176, 5, 33.0]
[176, 6, 33.0]
[176, 7, 33.0]
[176, 8, 33.0]
[176, 1, 23.0]
[176, 2, 23.0]
[176, 3, 23.0]
[176, 4, 23.0]
[176, 5, 23.0]
[176, 6, 23.0]
[176, 7, 23.0]
[176, 8, 23.0]
[176, 1, 32.0]
[176, 2, 32.0]
[176, 3, 32.0]
[176, 4, 32.0]
[176, 5, 32.0]
[176, 6, 32.0]
[176, 7, 32.0]
[176, 8, 32.0]
[176, 1, 61.0]
[176, 2, 61.0]
[176, 3, 61.0]
[176, 4, 61.0]
[176, 5, 61.0]
[176, 6, 61.0]
[176, 7, 61.0]
[176, 8, 61.0]
[176, 1, 28.0]
[176, 2, 28.0]
[176, 3, 28.0]
[176, 4, 28.0]
[176, 5, 28.0]
[176, 6, 28.0]
[176, 7, 28.0]
[176, 8, 28.0]
[176, 1, 21.0]
[176, 2, 21.0]
[176, 3, 21.0]
[176, 4, 21.0]
[176, 5, 21.0]
[176, 6, 21.0]
[176, 7, 21.0]
[176, 8, 21.0]
[176, 1, 20.0]
[176, 2, 20.0]
[176, 3, 20.0]
[176, 4, 20.0]
[176, 5, 20.0]
[176, 6, 20.0]
[176, 7, 20.0]
[176, 8, 20.0]
4 – Использование переменной

Код: Выделить всё

cc_msg = [0xB0, round(dist,2), round(dist*127,0)]
out.send_message(cc_msg)
print(cc_msg)
в этом примере я использовал «dist».
Переменные, которые я могу использовать: a[0], a[1], b [0], b[1], расстояние,

Вывод:

Код: Выделить всё

[176, 0.99, 125.0]
[176, 0.32, 40.0]
[176, 0.21, 27.0]
[176, 0.26, 33.0]
[176, 0.77, 98.0]
[176, 0.26, 34.0]
[176, 0.15, 20.0]
[176, 0.28, 36.0]
правильное количество строк! (ура)
конечно, значения каналов не статичны в этом случае......
ПОМОЩЬ
Извините, если ответ тривиален, я впервые программирую (с помощью Интернета)
Моя интуиция подсказывает мне, что ответ заключается в использовании формул с переменными, которые я есть в наличии. К сожалению, моя математика не такая уж сложная.

Подробнее здесь: https://stackoverflow.com/questions/792 ... array-loop
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

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

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»