从Camera2图像中裁剪矩形

时间:2017-04-24 22:41:22

标签: android image image-processing android-camera2

我有一张相机拍摄的YUV_420_888图像。我想从这个图像的灰度中裁剪一个矩形,以提供给图像处理算法。这就是我到目前为止所做的:

public static byte[] YUV_420_888toCroppedY(Image image, Rect cropRect) {
    byte[] yData;

    ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();

    int ySize = yBuffer.remaining();

    yData = new byte[ySize];

    yBuffer.get(yData, 0, ySize);

    if (cropRect != null) {

        int cropArea = (cropRect.right - cropRect.left) * (cropRect.bottom - cropRect.top);

        byte[] croppedY = new byte[cropArea];

        int cropIndex = 0;

        // from the top of the rectangle, to the bottom, sequentially add rows to the output array, croppedY
        for (int y = cropRect.top; y < cropRect.top + cropRect.height(); y++) {

            // (2x+W) * y + x
            int rowStart = (2*cropRect.left + cropRect.width()) * y + cropRect.left;

            // (2x+W) * y + x + W
            int rowEnd = (2*cropRect.left + cropRect.width()) * y + cropRect.left + cropRect.width();

            for (int x = rowStart;  x < rowEnd; x++) {
                croppedY[cropIndex] = yData[x];
                cropIndex++;
            }
        }

        return croppedY;
    }

    return yData;
}

此函数运行时没有错误,但我从中获取的图像是垃圾 - 它看起来像这样:

enter image description here

我不确定如何解决这个问题或我做错了什么。

1 个答案:

答案 0 :(得分:1)

您的rowStart / end计算错误。

您需要根据源图像尺寸计算行开始位置,而不是根据裁剪窗口尺寸计算行开始位置。而且我不确定你从哪里得到因子2;在图像的Y通道中每个像素有1个字节。

他们应该粗略地说:

int yRowStride = image.getPlanes()[0].getRowStride();
..
int rowStart = y * yRowStride + cropRect.left();
int rowEnd = y * yRowStride + cropRect.left() + cropRect.width();