Производительность OpenCV в реальном времени в Java против переполнения стека

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

Я работаю над своего рода «визуальным проводником» — я создал программу, которая отслеживает жесты рук человека и экстраполирует темп (в ударах в минуту) по этим жестам. То, что я хотел бы сделать сейчас, это отобразить измеренный темп в файл MIDI, который воспроизводится, пока человек ведет. По сути, я хотел бы, чтобы программа позволяла кому-то исполнять синтезированный фрагмент, где темп воспроизведения файла зависит от жестов проводника в реальном времени. Я написал это на C ++, используя библиотеки OpenCV.

Здесь вещи становятся интересными / волосатыми. Непосредственное изменение темпа MIDI-файла выглядит сложной задачей, и, учитывая ограниченное время, оставшееся у меня этим летом, я решил поискать другое. Мне удалось найти интерфейс Sequencer в Java API, в котором есть прекрасный метод под названием setTempoinBPM, Он делает именно то, что мне нужно; У меня просто были проблемы с тем, чтобы заставить его работать в моем C ++ коде.

Я пытался создать свою собственную JVM для вызова методов Java в коде C ++, но безрезультатно. Я также пытался вызывать программы Java, передавая соответствующие аргументы командной строки system(), но я не могу изменить темп MIDI-файла после начала воспроизведения с использованием этого подхода.

Я рассматриваю преобразование моего кода C ++ в код Java для вызова setTempoinBPM() напрямую, но я слышал противоречивые сообщения о том, повлияет ли это на производительность OpenCV.

Мне бы хотелось узнать ваше мнение: достаточно ли сопоставима производительность OpenCV на Java и производительность C ++, чтобы преобразование моего проекта в Java стоило бы усилий?
(Если вы знаете, как легко изменить темп воспроизведения дорожки MIDI, пожалуйста, поделитесь этим.)

4

Решение

Вместо сопоставления с файлом MIDI, возможно, вы могли бы использовать метод синтаксического анализа / компиляции.

Рассматривайте MIDI как представление данных (сериализованных). Разобрать данные в промежуточное представление (IR), которое имеет смысл для вашей конкретной проблемы (т. Е. Регулировать темп). Просто подумайте: «Как я могу лучше структурировать данные в памяти, чтобы было легко манипулировать темпом?»

Затем, используя пакет как это, Вы можете проанализировать MIDI-файл и извлечь важные части. Этот пакет уже может иметь IR, подходящий для вашей проблемы. Похоже, что у него есть метод сериализации, который может потребоваться для ввода файла обратно в проигрыватель. В качестве альтернативы вы можете найти игрока, которому вы сможете напрямую передать свой ИК. Если вы выберете IR, который уже используется для известного игрока (и все еще подходит для манипуляции с темпом), вам не придется рассматривать сериализацию IR после того, как вы его изменили.

Надеюсь, это поможет…

0

Другие решения

Я не очень разбираюсь в c ++, но немного использовал midi openFrameworks а также ofxMidi.

За кулисами он использует RtMIDI.

Выполняя быстрый поиск, похоже, что можно контролировать темп прямо с с ++ (см. bottom of void RtMidiIn :: initialize метод). Не уверен, что есть хороший чистый API, потому что я не так часто использовал rtMidi, но, возможно, стоит проверить.

0

По вопросам рекламы [email protected]