Объединение JavaCV и openCV

У меня следующая проблема: у меня есть приложение для Android, в котором используется собственный код OpenCV. На первом этапе кадры, которые редактировал OpenCV, поступали с камеры. Затем они были обработаны и нарисованы на дисплее.

Однако теперь мои требования изменились. Кадры, которые необходимо отредактировать, берутся из видеофайла, хранящегося на SD-карте. Они должны быть обработаны кодом openCV, а затем сохранены в новом видеофайле.

Прочитав много вещей, я понял, что в Android нет встроенных средств для правильного чтения видеофайла по кадрам и для обработки кадров при этом. На компьютере OpenCV имеет функцию VideoCapture. Но это не работает на Android, так как openCV не имеет встроенного ffmpeg.

Прочитав больше материала, я обнаружил, что JavaCV поставляется с FFMPEGFrameGrabber, а также FFMPEGFrameRecorder. Итак, я реализовал все, что теперь позволяет мне брать отдельные кадры из видео, получать кадр IplImage и сохранять этот кадр в новом видео.

Теперь проблема: во время получения и сохранения кадр IplImage должен обрабатываться с использованием исходного кода OpenCV, поскольку невозможно перенести весь код на JavaCV.

Итак, в первую очередь я написал небольшую тестовую функцию JNI, которая получает адрес объекта MAT и рисует на нем небольшой кружок.

extern "C" {
JNIEXPORT void JNICALL Java_de_vion_postprocessing_step2_EyeTracking_editFrame(
    JNIEnv*, jobject, jlong thiz, jlong addrRgba) {
//Convert the mat addresses into the objects
Mat& rgbFrame = *(Mat*) addrRgba;

Point2i scaledSmoothPoint(100,100);
circle(rgbFrame, scaledSmoothPoint, 20, YELLOW, -1);
}

Когда я прочитал, что IplImage расширяет CvArr, я просто вызываю функцию в своем коде следующим образом:

captured_frame = grabber.grab();
if (captured_frame == null) {
    // no new frames
    break;
}
editFrame(captured_frame .address());

Однако теперь я получаю следующую ошибку:

06-12 18:58:23.135: E/cv::error()(6498): OpenCV Error: Assertion failed (cn <= 4) in
                    void cv::scalarToRawData(const Scalar&, void*, int, int), file 
                    /home/reports/ci/slave_desktop/50-SDK/opencv/modules/core/src/matrix.cpp, line 845
06-12 18:58:23.135: A/libc(6498): Fatal signal 6 (SIGABRT) at 0x00001962 (code=-6),
                    thread 6526 (AsyncTask #1)

Наконец, у меня вопрос: как я могу обработать кадр IplImage с помощью nativeOpenCV и, наконец, сохранить этот кадр IplImage затем в видеомагнитофоне.

Я также открыт для новых идей, которые не обязательно требуют JavaCV, если мне не нужно самостоятельно писать FrameGrabber и FrameRecorder.

С уважением, Андре


person Vion    schedule 12.06.2014    source источник
comment
Я знаю это. По этой причине я не использую JavaCV для обработки изображений. Я использую только JavaCV FFmeg Grabber и Recorder, поскольку OpenCV не предоставляет такую ​​функциональность для Android.   -  person Vion    schedule 12.06.2014


Ответы (1)


Intel выпустила новый инструмент под названием INDE, который содержит компонент под названием INDE Media Pack. Однако здесь используется Java. Медиа-пакет использует платформу мультимедиа Android, в нем были реализованы тяжелые инкапсуляции определенных функций и добавлено несколько вещей, чтобы упростить обработку видео / аудио / изображений. Вы можете загрузить его с здесь

Вот как вы можете выполнять захват видео, начиная с определенного кадра и заканчивая кадром (не полный код, просто чтобы дать вам представление) с помощью INDE. После загрузки инструмента вы найдете много примеров кода.

    public void start(String videoPath) throws IOException
    {
        if (isStarted())
        {
            throw new IllegalStateException(TAG + " already started!");
        }

        capturer = new GLCapture(new AndroidMediaObjectFactory());

        capturer.setTargetFile(videoPath);
        capturer.setTargetVideoFormat(videoFormat);

        capturer.start();

        isStarted = true;
        isConfigured = false;
        framesCaptured = 0;
    }

Надеюсь это поможет.

person G3M    schedule 13.06.2014
comment
Спасибо. Я посмотрю на это позже. Звучит действительно хорошо. - person Vion; 14.06.2014