我正在开发一个从相机
获取图像
或预览图像
的项目,那么我必须计算蓝色的平均数量
在图像中,我已经从相机快速拍摄了图像(作为预览图像
)。
图像格式是 NV21 (真的不是图像格式专家,所以我不知道他们为什么使用它)
这就是我从相机预览回调
读取图像的方式
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);
}
正如你所见,我现在有了位图
,我计划通过读取位图
像素来确定图像中的蓝色,然后处理像素通过 Pixel
,但同事说这种方式在某些情况下又重又慢,并且不准确,而且我必须从硬件本身获取图像中的蓝色作为矩阵,并且我不知道从哪里开始(顺便说一句,我的同事使用 iOS 版本),任何帮助将不胜感激。
最佳答案
如果您在 Android 上使用 opencv,则可以进行简单的 native 调用 (JNICALL),将位图作为 jbyte* 传递给函数,然后在函数中使用以下命令将其转换为 BGR 垫 myuv,mbgra; cvtColor(myuv, mbgra, CV_YUV420sp2BGR, 4);
然后分割矩阵 mbgra ,在发现没有蓝色像素是分割矩阵上的二进制掩码操作之后,因为它是原生的,并且您不会逐个像素地查看每个像素,它可能会很快。
关于java - 在相机预览中计算颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13253388/