Компьютерное зрение, C ++ ИЛИ Java - PullRequest
13 голосов
/ 03 января 2012

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

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

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

Ответы [ 6 ]

16 голосов
/ 04 января 2012

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

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

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

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

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

15 голосов
/ 03 января 2012

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

10 голосов
/ 02 ноября 2012

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.

2 голосов
/ 03 января 2012

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

1 голос
/ 19 ноября 2018

Среди C ++ или Java лучше использовать C ++. У меня почти нет опыта работы с Java, но причина, по которой я бы порекомендовал C ++, заключается в том, что он широко используется в библиотеках ML и CV.

Одним из лучших решений мощного и гибкого приложения для компьютерного зрения может быть следующая последовательность:

  1. обучение модели с использованием гибкого Python и популярных библиотек машинного обучения;
  2. хранение предварительно обученных гирь;
  3. переписать лучшую модель архитектуры на C ++ с использованием библиотеки OpenCV с полезным, но не обширным Mat классом или компилировать в модель C ++ ML;
  4. компиляция с определенной спецификацией процессора вашего устройства.

Преимуществами этого решения являются скорость работы приложения, безопасность кода, скорость разработки и совместимость со многими устройствами. Кроме того, Python Tensorflow и другие модели могут быть загружены в C ++, например, PyTorch . Кроме того, гораздо проще получить помощь от сообщества CV с кодом C ++ OpenCV.

Недостатками являются тонны проблем разработки и скорость разработки (которые не могут быть пропущены в Java), иногда строгие ограничения гибкости OpenCV lib и многие другие, о которых вы могли не думать в начале.

1 голос
/ 17 августа 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...