替换Java中的无符号类型

时间:2012-12-02 23:46:02

标签: java android opencv

在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);
    }
}

有更快的方法吗?

2 个答案:

答案 0 :(得分:3)

实际上可以在提取之前将Mat转换为有符号字节:

mat.convertTo(mat, CvType.CV_8S);

答案 1 :(得分:2)

虽然Java确实不支持无符号基元类型,但只有在使用值进行实际算术时才会有所不同。 8位是8位,有符号或无符号。如果您需要使用值计算某些内容,是 - 您应该使用更大的类型(实际上是原始的两倍)以避免溢出(带符号字节-127:128,未编译:0:255)并且您应该执行一些转换摆脱“符号部分”(在字节和0xFF的情况下)。 编辑:这是一般答案,我没有使用过OpenCV4Android。虽然在特定情况下,出于内存消耗的原因使用无符号类型可能有意义,但我猜测库实际上会以正确的形式为平台输出所需的值吗?