0

我正在从事一个项目,Images从那时Preview ImagesCamera我必须计算Blue图像中的平均计数,我已经快速从相机中拍摄了图像(As Preview Images)。图像格式是NV21 (真的不是图像格式专家,所以我不知道他们为什么使用它)

这就是我从Camera Preview Callback

public void onPreviewFrame(byte[] data, Camera camera) {

        Camera.Parameters parameters = camera.getParameters();
        Size size = parameters.getPreviewSize();
        YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width,
                size.height, null);
        Rect rectangle = new Rect();
        rectangle.bottom = size.height;
        rectangle.top = 0;
        rectangle.left = 0;
        rectangle.right = size.width;
        ByteArrayOutputStream out2 = new ByteArrayOutputStream();
        image.compressToJpeg(rectangle, 100, out2);

        byte[] d = out2.toByteArray();
        Bitmap bitmap = BitmapFactory.decodeByteArray(d, 0, d.length);
    }

正如你所看到的,我Bitmap现在有,我打算通过读取Bitmap像素然后处理来确定图像中的蓝色Pixel by Pixel,但是同事说这种方式在某些情况下很重而且很慢而且 不准确,我必须得到图像中的蓝色作为硬件本身的矩阵,并且不确定从哪里开始(顺便说一句,我的同事在 iOS 版本上工作),任何帮助将不胜感激。

4

1 回答 1

1

如果你使用opencv for android,你可以有一个简单的本地调用(JNICALL)将位图作为 jbyte* 传递给函数,然后在函数中使用 Mat myuv 将其转换为 BGR ,mbgra; cvtColor(myuv, mbgra, CV_YUV420sp2BGR, 4);

然后拆分矩阵 mbgra ,在此发现没有蓝色像素是对拆分矩阵的二进制掩码操作之后,因为它是原生的,并且您不会逐个像素地查看它可能会很快。

于 2012-11-07T22:29:00.317 回答