2013-07-29 2 views
4

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

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

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

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

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

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

+1

Так много вопросов в одном посте. Я действительно не знаю, почему вы переходите на переписывание всего, что у вас уже так легко. Я не знаю хорошего бесплатного MIDI API для C++, но я играл с [Java Invocation API] (http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/invocation. html), и это действительно было не так сложно. Вы должны изучить это, если вы не найдете хороший C++ lib. – PeterT

+0

Жаль, если это было неясно - ссылка, которую вы опубликовали, была именно тем, что я пытался сделать с созданием моей собственной JVM, и по какой-то причине я не могу заставить ее работать. (Наверное, что-то действительно просто, я забываю, но все же.) Я ценю ваш ответ, хотя! – Connor

+0

@ Коннектор звучит как классный проект! –

ответ

0

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

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

Затем, используя пакет like this, вы можете разобрать файл midi и извлечь важные части. У этого пакета может быть IR, который подходит для вашей проблемы. Конечно, похоже, что у него есть метод сериализации, который может потребоваться для ввода файла обратно в плеер. Кроме того, вы можете найти игрока, с которым вы можете напрямую передавать свой IR. Если вы выберете IR, который уже используется для известного игрока (и по-прежнему подходит для ваших темпов манипуляции), вам не придется рассматривать сериализацию вашего IR после того, как вы его изменили.

Надежда, что помогает ...

+0

Спасибо за предложение. У меня есть еще несколько таких библиотек, которые я просматривал. Надеюсь, я смогу заставить это работать с чем-то менее низким уровнем, но хорошо иметь некоторые варианты, если не существует решений высокого уровня. Я ценю это! – Connor

0

Я не очень опытный с C++, но использовали миди немного через openFrameworks и ofxMidi.

За кулисами используется rtMidi.

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

+0

Спасибо за ваш ответ! Я смотрю на некоторые подобные библиотеки, но всегда полезно иметь другой вариант. – Connor

Смежные вопросы