У меня следующая проблема: у меня есть приложение для 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.
С уважением, Андре