Я использую 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 () для каждой матрицы.