Страницы

Поиск по вопросам

Показаны сообщения с ярлыком javacv. Показать все сообщения
Показаны сообщения с ярлыком javacv. Показать все сообщения

воскресенье, 15 марта 2020 г.

JavaCV FFmpeg ClassNotFoundException

#java #centos #javacv


Есть приложение которое пишет видео с rtsp потока. Проект собираю с помощью gradle.
На локальной машине (там стоит kubuntu) все работает хорошо и верно. Как я отправляю
свой .war на сервер(там стоит CentOS), то получаю такую вот ошибку   


  java.lang.ClassNotFoundException: org.bytedeco.javacpp.avutil$AVFrame. 


И на локальной и на удаленной машине стоит Tomcat. Пробовал собирать проект на другой
машине с kubuntu и там тоже все работает без ошибок. В чем беда?

UDP: 
Ошибка  java.lang.NoClassDefFoundError



Так добавляю в gradle все зависимости.



И дерево с библиотеками 



Проверил какие библиотеки попадают в war. действительно класса org.bytedeco.javacpp.avutil
там нет.



Что я делаю не так? На двух машинах с kubuntu это работает.

UPDATE

Как я понял для CentOS надо самому собрать библиотеку. Делаю все по инструкции

Building JavaCV on CentOS 6.5

Но на шаге 9 получаю ошибку 


Build the opencv profile only, and install into local maven cache

mvn install --projects opencv




UPDATE 2

Связался с разработчиком библиотеки. Он говорит что эта старая инструкция создания
библиотеки и предложил новую.
Инструкция
Но получаю ошибку на шаге 


  $ wget https://linuxsoft.cern.ch/cern/devtoolset/slc6-devtoolset.repo
  
  $ rpm --import https://linuxsoft.cern.ch/cern/slc6X/x86_64/RPM-GPG-KEY-cern



    


Ответы

Ответ 1



java.lang.ClassNotFoundException всегда значит одно и то же: виртуальная машина не смогла найти класс, вызываемый по строковому представлению его полного имени. В данном случае Java не может найти в CLASSPATH класс org.bytedeco.javacpp.avutil$AVFrame. Убедитесь, что соответствующая библиотека (вероятно это JavaCPP Presets, от которой зависит JavaCV) попала в сборку.

Ответ 2



вроде для работы с javacv надо: 1) добавлять библиотеку OpenCV в ОС 2) добавить зависимость на JavaCV в мавен. JavaCV работает как обёртка для основной библиотеки OpenCV

воскресенье, 26 января 2020 г.

Java объединение видеофайлов в один FFmpeg

#java #видео #ffmpeg #javacv


Код:

for (File f : files) {
            FrameGrabber grabber = new FFmpegFrameGrabber(f.getPath());
            grabber.start();
            while ((frame = grabber.grab()) != null) {
                recorder.record(frame);
            }
            grabber.stop();
        }


И вроде работает нормально, но если файлов много, то долго очень. Есть какой-нибудь
метод у этой библиотеки, чтобы просто склеить файлы, а не "грабить" каждый? 
    


Ответы

Ответ 1



Посмотрите в сторону FfmpegController.concatAndTrimFilesMP4Stream(): package org.ffmpeg.android.test; import java.io.File; import java.util.ArrayList; import java.util.Locale; import net.sourceforge.sox.SoxController; import org.ffmpeg.android.Clip; import org.ffmpeg.android.FfmpegController; import org.ffmpeg.android.ShellUtils; public class ConcatTest { public static void test (String videoRoot, String fileTmpPath, String fileOut, double fadeLen) throws Exception { File fileTmp = new File(fileTmpPath); File fileAppRoot = new File(""); File fileVideoRoot = new File(videoRoot); FfmpegController fc = new FfmpegController(null, fileTmp); SoxController sxCon = new SoxController(null, fileAppRoot, null); ArrayList listVideos = new ArrayList(); String[] fileList = fileVideoRoot.list(); for (String fileVideo : fileList) { if (fileVideo.endsWith("mp4")) { Clip clip = new Clip(); clip.path = new File(fileVideoRoot,fileVideo).getCanonicalPath(); fc.getInfo(clip); clip.duration = clip.duration-fadeLen; listVideos.add(clip); } } Clip clipOut = new Clip (); clipOut.path = new File(fileOut).getCanonicalPath(); fc.concatAndTrimFilesMP4Stream(listVideos, clipOut, false, false, new ShellUtils.ShellCallback() { @Override public void shellOut(String shellLine) { System.out.println("fc>" + shellLine); } @Override public void processComplete(int exitValue) { if (exitValue < 0) System.err.println("concat non-zero exit: " + exitValue); } }); } } Взято отсюда

Ответ 2



Возможно это вам поможет: cmd="( " h264options="-vcodec libx264 -b 512k -flags +loop+mv4 -cmp 256 \ -partitions +parti4x4+parti8x8+partp4x4+partp8x8+partb8x8 \ -me_method hex -subq 7 -trellis 1 -refs 5 -bf 3 \ -flags2 +bpyramid+wpred+mixed_refs+dct8x8 -coder 1 -me_range 16 \ -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10\ -qmax 51 -qdiff 4" outfile="out-`date +%F-%H%M.%S`.mp4" for i; do cmd="${cmd}ffmpeg -i $i -ab 256000 -vb 10000000 -mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -f mpeg -; " done cmd="${cmd} ) | ffmpeg -y -i - -threads 8 ${h264options} -vb 10000000 -acodec libfaac -ar 44100 -ab 128k -s 1280x720 ${outfile}" echo "${cmd}" eval ${cmd}

четверг, 5 декабря 2019 г.

Настройка распознавания лиц в OpenCV

#java #cpp #opencv #распознавание_образов #javacv


У меня есть набор изображений для обучения: для двух персон по 10 изображений и 80
изображений различных персон для проверки достоверности распознавания. Имеется 3 контрольных
изображения, по 1 с каждой персоной и одна общая с десяткой персон (в которую входят
первые две и несколько из 80). На всех изображениях персоны расположены фронтально.
Хотелось бы в результате распознавания на всех 3 контрольных изображениях опознать
две персоны, для которых производилось обучение с помощью 10 изображений.
Проблема заключается в том, что все 3 алгоритма (LBPH, Fisherfaces, Eigenfaces) не
справились с этой задачой (на одном или двух изображениях помечают персону другой,
причем для которой было всего 1 обучающее изображение), очевидно, у меня где-то ошибка
в последовательности обучения или распознавания, или я чего-то не учел.

Добавление изображения для обучения:


считать изображения для обучения в градациях серого 
определить позицию лица и сделать новое изображение на основе этой позиции
для алгоритов кроме LBPH привести изображения к одному размеру (я так и не смог определить,
какой лучше всего размер использовать, наугад тыкал разные)
Histogram Equalization
добавить в вектор который потом пойдет в обучение


Добавление изображения для распознавания:


Определить все лица на изображении в градации серого и для каждого выполнить
сделать новое изображение на основе позиции
для алгоритов кроме LBPH привести изображения к одному размеру
Histogram Equalization
отправить на распознавание


Буду рад принять любые советы и ответить на Ваши вопросы, спасибо за помощь!
    


Ответы

Ответ 1



В рамках учебного процесса выполнял ваши задачи(как раз эти три алгоритма), вот github Если вкратце, брал изображение с камеры и определял, кто этот человек из локальной базы данных(набор изображений). Там есть форма, в которой можете покрутить параметры по всем трем алгоритмам Но github не позволил загрузить библиотеки emgu с проектом, т.к. они слишком много весят, вам придется добавить их вручную Если нужно будет, я могу их загрузить отдельно через другой ресурс

Ответ 2



Процесс распознавания лица можно разбить на 3 стадии: выделение области с лицом нормализация изображения сравнение и анализ OpenCV предоставляет утилиты для 1 и 3 стадии, а вот 2 стадию (самую сложную) возлагает ответственность на пользователя. Алгоритмы LBPH, Fisherfaces, Eigenfaces достигают 90% точности распознавания на специально подготовленных изображениях (нормализованных). Если взять подборку AT&T, то можно заметить, что у них все изображения: имеют одинаковый размер (ширина и высота), все приведены к градации серого с нормализацией, однотонный фон, лица отцентрированы и произведено выравнивание на основе опорных точек и произведены другие методы нормализации. Пример выполнения процесса нормализации. Разбор и анализ алгоритмов распознавания, используемых в OpenCV. AT&T Facedatabase. Таким образом, проблема низкой точности распознавания в моем случае заключалась в том, что изображения имели низкий уровень нормализации. Для повышения уровня точности нужно либо добавлять различные алгоритмы для нормализации изображений, либо использовать для распознавания более современные алгоритмы, основанные на нейронных сетях и машинном обучении После нормализации на основе алгоритма из статьи существенно увеличилась точность определения (я добавил поворот и масштабирование изображения на основе положения глаз).

понедельник, 8 октября 2018 г.

Настройка распознавания лиц в OpenCV

У меня есть набор изображений для обучения: для двух персон по 10 изображений и 80 изображений различных персон для проверки достоверности распознавания. Имеется 3 контрольных изображения, по 1 с каждой персоной и одна общая с десяткой персон (в которую входят первые две и несколько из 80). На всех изображениях персоны расположены фронтально. Хотелось бы в результате распознавания на всех 3 контрольных изображениях опознать две персоны, для которых производилось обучение с помощью 10 изображений. Проблема заключается в том, что все 3 алгоритма (LBPH, Fisherfaces, Eigenfaces) не справились с этой задачой (на одном или двух изображениях помечают персону другой, причем для которой было всего 1 обучающее изображение), очевидно, у меня где-то ошибка в последовательности обучения или распознавания, или я чего-то не учел.
Добавление изображения для обучения:
считать изображения для обучения в градациях серого определить позицию лица и сделать новое изображение на основе этой позиции для алгоритов кроме LBPH привести изображения к одному размеру (я так и не смог определить, какой лучше всего размер использовать, наугад тыкал разные) Histogram Equalization добавить в вектор который потом пойдет в обучение
Добавление изображения для распознавания:
Определить все лица на изображении в градации серого и для каждого выполнить сделать новое изображение на основе позиции для алгоритов кроме LBPH привести изображения к одному размеру Histogram Equalization отправить на распознавание
Буду рад принять любые советы и ответить на Ваши вопросы, спасибо за помощь!


Ответ

Процесс распознавания лица можно разбить на 3 стадии:
выделение области с лицом нормализация изображения сравнение и анализ
OpenCV предоставляет утилиты для 1 и 3 стадии, а вот 2 стадию (самую сложную) возлагает ответственность на пользователя. Алгоритмы LBPH, Fisherfaces, Eigenfaces достигают 90% точности распознавания на специально подготовленных изображениях (нормализованных). Если взять подборку AT&T, то можно заметить, что у них все изображения: имеют одинаковый размер (ширина и высота), все приведены к градации серого с нормализацией, однотонный фон, лица отцентрированы и произведено выравнивание на основе опорных точек и произведены другие методы нормализации. Пример выполнения процесса нормализации. Разбор и анализ алгоритмов распознавания, используемых в OpenCV. AT&T Facedatabase
Таким образом, проблема низкой точности распознавания в моем случае заключалась в том, что изображения имели низкий уровень нормализации. Для повышения уровня точности нужно либо добавлять различные алгоритмы для нормализации изображений, либо использовать для распознавания более современные алгоритмы, основанные на нейронных сетях и машинном обучении
После нормализации на основе алгоритма из статьи существенно увеличилась точность определения (я добавил поворот и масштабирование изображения на основе положения глаз).