在相机预览中计算颜色

时间:2012-11-06 14:44:03

标签: java android image-processing colors bitmap

正在处理从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版本上工作),任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

然后分割矩阵mbgra,在此发现之后,蓝色像素中没有一个是分裂矩阵的二元掩模操作,因为它的原生并且你不会逐个像素地查看它可能很快。