JavaCV использует оболочку под названием JavaCPP для вызова OpenCV из программ Java. JavaCPP автоматически генерирует временные собственные библиотеки, которые образуют мост, используемый JNI, чтобы позволить программам Java вызывать собственные библиотеки OpenCV.
Решение элегантное и хорошо работает, но довольно придирчиво к установке правильных версий и правильной установке путей к классам. Вы можете получить представление о трудностях, с которыми люди сталкиваются на дискуссионном форуме JavaCV, и по адресу http://code.google.com/p/javacv/wiki/Windows7AndOpenCV.
Я работал с OpenCV-2.3.1 в XP, Windows 7 и Ubuntu 10.11, и все же мне потребовалось несколько дней, чтобы обновить все до OpenCV-2.4.2. ffmpeg особенно сложно получить право на всех платформах.
При использовании Java для высокоуровневого управления программами происходит небольшое или нулевое снижение скорости, поскольку объекты изображений и структуры данных на основе списков поддерживаются на собственной стороне с помощью указателей. Одна ловушка - это знание того, кто отвечает за освобождение выделенной памяти, поэтому будьте готовы к сбоям ВМ со сложными программами.
При переносе объектов данных на сторону Java возникают некоторые накладные расходы. Я обнаружил, что копирование местоположения ключевой точки в объект Point на стороне Java занимает около 1 микросекунды. Это звучит не так много, но в приложении реального времени с тысячами ключевых точек это может иметь значение. Мы также копируем объекты JavaCV IplImage в Java через ByteBuffers. Это занимает миллисекунду или меньше, поэтому вполне возможно для использования в реальном времени.
В нашем случае у нас есть значительный объем кода Java, который можно использовать против OpenCV. А сборка мусора в Java делает многие вещи намного проще. Я удовлетворен тем, что затраты на изучение JavaCV того стоили.
Я счел необходимым собрать проект в Eclipse и скомпилировать JavaCV из исходного кода вместо использования javacv.jar. (Тем не менее, вам понадобятся другие файлы .jar.) Это позволит вам изучить исключения, чтобы отследить версию библиотеки и ошибки пути к классам. И источник JavaCV необходим, чтобы понять, как JavaCV предоставляет API OpenCV.