我想通过解码byte []列表并按行和列进行合成来构成JavaCV的Mat,例如下面的代码:
int index = 0;
MatVector colVector = new MatVector();
OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
for (int i = 0; i < grid.getRows(); ++i)
{
Mat rowMat = new Mat();
MatVector vector = new MatVector();
for (int j = 0; j < grid.getColumns(); ++j)
{
int tileId = grid.getToItemIdList().get(index);
List<Byte> tileBinary = tileBinaryMap.get(tileId);
FFmpegFrame grabber = new FfmpegFrameGrabber(new ByteArrayInputStream(Bytes.toArray(tileBinary));
grabber.start();
Frame frame = grabber.grab();
Mat tileMat = converter.convertToMat(frame);
vector.push_back(tileMat);
index++;
}
hconcat(vector, rowMat);
colVector.push_back(rowMat);
}
Mat imageMat = new Mat();
vconcat(colVector, imageMat);
显然,这个问题是可并行的,我的想法是用预先计算的宽度和高度(甚至是深度,因为它们是图像)创建一个大垫子,然后用线程生成每个图块并将解码的数据填充到垫。目前,我只是水平串联每列,然后垂直串联所有行。我不知道如何用JavaCV中的偏移量来操作指针。 我另一个担心的是,频繁创建的采集器对象是否是瓶颈?有另一种解决方法吗?