Подтвердить что ты не робот

Компьютерное зрение, С++ или Java

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

Я узнал, что OpenCV написан на С++, а в то время как Java имеет оболочку (JavaCV), я понял, что приложения на Java медленнее, чем на С++, и большинство корпоративных приложений написаны на С++.

Мой вопрос заключается в следующем: у меня есть несколько лет опыта работы на Java, и мне очень удобно писать с ним какое-либо приложение; было бы разумно перейти на С++, чтобы изучить CV, или я должен придерживаться Java и использовать его обертку.

4b9b3361

Ответ 1

Я предлагаю придерживаться того, с которым вам удобно сейчас. Переключайтесь только на С++, когда обнаружите, что он не предоставляет определенные API-интерфейсы, которые вы хотите, или производительность фактически становится проблемой. Прямо сейчас, вы находитесь на этапе обучения.

Ответ 2

Компьютерное зрение является требовательной областью - и хотя верно, что вам лучше всего оставаться с тем, что вы знаете, и переходите к opencv только в случае необходимости, другая правда заключается в том, что вам нужно углубиться в математику, указатели и алгоритмы для изучения и создания хорошего приложения для компьютерного зрения. И сделать это в Java может быть более громоздким, чем изучение С++.

Итак, если все, что вы хотите сделать, это применить фильтр к изображению для какого-либо школьного проекта - перейдите на Java. Но если вы хотите больше оставаться с OpenCV, изучать алгоритмы видения или писать свои собственные, мое сильное предложение - изучить С++ - это не так страшно!

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

Вкратце, изучение С++ намного проще, чем компьютерное зрение. И OpenCV - это не просто библиотека, которую вы хотите вызвать, чтобы сделать некоторую обработку там. Это технология кровотечения - вы захотите ее понять, взломать ее, построить над ней, пройти код, гораздо больше, чем вызвать someJNIfunc();

И если вы это сделаете, помните, что OpenCV предлагает два интерфейса: один для C и один для С++. И хотя они предлагают ту же функциональность, С++ один очень похож на Java - с автоматическим управлением памятью и большим количеством конфессий. Вы можете обратиться к этому, чтобы увидеть различия

Ответ 3

JavaCV использует оболочку под названием JavaCPP для вызова OpenCV из программ Java. JavaCPP автоматически создает временные родные библиотеки, которые образуют мост, используемый JNI, чтобы Java-программы вызывали родные библиотеки OpenCV.

Решение элегантно, и оно работает хорошо, но довольно сложно установить правильные версии и правильно настроить classpaths. Вы можете увидеть трудности, с которыми сталкиваются люди на дискуссионном форуме 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 для управления программным обеспечением высокого уровня, слишком мало или вообще нет накладных расходов, поскольку объекты изображений и структуры данных на основе списка поддерживаются на внутренней стороне с помощью указателей. Одна ловушка знает, кто несет ответственность за выделение выделенной памяти, поэтому будьте готовы к сбоям VM со сложными программами.

При переносе объектов данных на сторону Java существует небольшая накладная нагрузка. Я обнаружил, что для копирования местоположения ключевой точки в объект Point на Java требуется около 1 микросекунды. Это не похоже на много, но в режиме реального времени с тысячами ключевых точек это может изменить ситуацию. Мы также копируем объекты JavaCV IplImage в Java через ByteBuffers. Это занимает миллисекунду или менее, поэтому вполне возможно для использования в режиме реального времени.

В нашем случае у нас есть существенный кусок кода Java для использования против OpenCV. И сборка мусора Java делает многое намного проще. Я удовлетворен тем, что накладные расходы на обучение JavaCV оправдали его.

Мне было необходимо построить проект в Eclipse и скомпилировать JavaCV из исходного кода вместо использования javacv.jar. (Тем не менее, вам понадобятся и другие .jar файлы.) Это позволяет вам просматривать исключения для отслеживания ошибок библиотеки и ошибок класса. И источник JavaCV необходим, чтобы понять, как JavaCV предоставляет API OpenCV.

Ответ 4

Сколько времени потрачено в библиотеке OpenCV и сколько времени тратится на вашу программу? Если ваша программа полностью на С++, она не может сократить время, потраченное в вашей программе (вне библиотеки), на меньшее, чем ничего. например если вы тратите 99% своего времени в библиотеке, использование С++ не может сделать его более чем на 1% быстрее.

Ответ 5

Для простых программ Java и С++ не имеют существенных различий в скорости. Но для большого кода с большой вычислительной сложностью С++ оказывается быстрее. У упаковщиков есть проблема с накладными расходами. Но это будет незначительно для небольшой программы. Если вы пишете сложный код в Java, его легко переписать на С++. Это связано с большим количеством функций, доступных в Java, которые будут сильно отличаться от С++.

Следует ли использовать Java или С++ для OpenCV, зависит от вашего мотива. Если вы серьезно хотите использовать OpenCV и работать над некоторыми крупными проектами, я предлагаю вам перейти на С++. Но если вы ищете для вас просто развлечение с OpenCV, лучше будет придерживаться того, что вы знаете.