在OpenCV中,使用Mat的最快方法是首先将其复制到适当的基本类型的数组中,如下所示:
byte[][] array = new byte[rows][cols];
for (int i = 0; i < rows; i++) {
mat.get(i, 0, array[i]);
}
但是,这在带有无符号Mat类型的OpenCV4Android中不起作用(例如8U
),因为Java缺少无符号类型。我可以复制到下一个较大的基元类型的数组(这里是一个简短的),同时为每个元素添加256:
byte[] buf = new byte[cols];
short[][] array = new short[rows][cols];
for (int i = 0; i < rows; i++) {
mat.get(i, 0, buf);
for (int j = 0; j < cols; j++) {
array[i][j] = (short) (buf[i]+256);
}
}
有更快的方法吗?
答案 0 :(得分:3)
实际上可以在提取之前将Mat转换为有符号字节:
mat.convertTo(mat, CvType.CV_8S);
答案 1 :(得分:2)
虽然Java确实不支持无符号基元类型,但只有在使用值进行实际算术时才会有所不同。 8位是8位,有符号或无符号。如果您需要使用值计算某些内容,是 - 您应该使用更大的类型(实际上是原始的两倍)以避免溢出(带符号字节-127:128,未编译:0:255)并且您应该执行一些转换摆脱“符号部分”(在字节和0xFF的情况下)。 编辑:这是一般答案,我没有使用过OpenCV4Android。虽然在特定情况下,出于内存消耗的原因使用无符号类型可能有意义,但我猜测库实际上会以正确的形式为平台输出所需的值吗?