Почему ошибка сегментации при вызове hconcat с Mat в JavaCV - PullRequest
0 голосов
/ 02 июля 2019

Я использую JavaCV 1.3.3 со следующим кодом, намереваясь объединить фрагменты Mat в целый Mat (imageMat). при вызове hconcat я уже выделяю достаточно места в целевой матрице (rowMat).

    int index = 0;
    MatVector colVector = new MatVector(grid.getRows());
    OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
    for (int i = 0; i < grid.getRows(); ++i)
    {
        MatVector vector = new MatVector(grid.getColumns());
        for (int j = 0; j < grid.getColumns(); ++j)
        {
            List<Byte> tileBinary = tileBinaryMap.get(index);
            FFmpegFrame grabber = new FfmpegFrameGrabber(new ByteArrayInputStream(Bytes.toArray(tileBinary));
            grabber.start();
            Frame frame = grabber.grab();
            Mat tileMat = converter.convertToMat(frame);
            vector.push(j, tileMat);
            index++;
        }
        Mat tile = vector.get(0);
        Mat rowMat = new Mat(tile.rows(), tile.cols() * grid.getColumns(), tile.type());
        hconcat(vector, rowMat); //on MacOSX, will cause segmentation fault
        colVector.push(i, rowMat);
    }
    Mat row = colVector.get(0);
    Mat imageMat = new Mat(row.rows() * grid.getRows(), row.cols(), row.type());
    vconcat(colVector, imageMat);

Ошибка сегментации не возникнет сразу. Когда приложение (встроенное в приложение с графическим интерфейсом) работает некоторое время (например, декодирует несколько разных входных двоичных файлов), и оно randomly падает. Журнал ошибок выглядит следующим образом:

    SIGSEGV (0xb) at pc=0x00007fff754e3010, pid=18031, tid=0x0000000000010e03
    C  [libsystem_platform.dylib+0x5010]  _platform_memmove$VARIANT$Haswell+0xf0
    C  [libopencv_core.3.2.dylib+0x61531]  _ZNK2cv3Mat6copyToERKNS_12_OutputArrayE+0xc71
    C  [libopencv_core.3.2.dylib+0x14ab21]  _ZN2cv7hconcatEPKNS_3MatEmRKNS_12_OutputArrayE+0x281
    C  [libopencv_core.3.2.dylib+0x14b5d2]  _ZN2cv7hconcatERKNS_11_InputArrayERKNS_12_OutputArrayE+0x52
    C  [libjniopencv_core.dylib+0x13415e]  Java_org_bytedeco_javacpp_opencv_1core_hconcat__Lorg_bytedeco_javacpp_opencv_1core_00024MatVector_2Lorg_bytedeco_javacpp_opencv_1core_00024Mat_2+0xee
    j  org.bytedeco.javacpp.opencv_core.hconcat(Lorg/bytedeco/javacpp/opencv_core$MatVector;Lorg/bytedeco/javacpp/opencv_core$Mat;)V+0

Устранит ли эта проблема обновление JavaCV до версии 1.5? Как управлять памятью Mat / MatVector в JavaCV в целом. Будет ли мой код, приведенный выше, вызывать утечку памяти, так как я не вызываю Mat's release () для каждой матрицы.

...