如何从Android相机捕获原始图像

Fre*_*d F 11 camera android

takePicture rawCallback返回一个空指针.getPictureFormat仅允许使用.jpg.虽然可以使用getParameters()setJpegQuality(100)setParameters改进jpeg,但返回的图像仍然是jpeg.要获取位图图像需要调用BitmapFactory.decodeByteArray,这可能需要1/2秒才能处理.

我正在处理的应用程序需要相机可以生成的最详细的图像,这并不一定意味着漂亮.原始相机芯片捕获格式是拜耳.

Fre*_*d F 10

所述机器人(至少矿)具有2个摄像机参数"rawsave-mode""rawfname",用默认rawsave-mode=0.通过设置rawsave-mode=1,相机将保存原始相机图像文件,并像往常一样执行其他相机功能.

Camera.Parameters parameters=preview.camera.getParameters();
parameters.set("rawsave-mode", "1");
parameters.set("rawfname", "/mnt/sdcard/test.raw");
preview.camera.setParameters(parameters);
preview.camera.takePicture(shutterCallback, null, jpegCallback);
Run Code Online (Sandbox Code Playgroud)

生成的文件的实际名称将被修改为包括正在生成的原始文件的参数.对于我的一个机器人,产生的名称"test__1604x1206_10_2.raw"是a1 1604x1206图像,10bit格式2.并且"test__1284x966_10_3.raw"是1284x966图像,10 bit格式3. 10 bytes存储为2 byte short int (little endian).

parameters.set("rawsave-mode", "2");
// setting the rawsave-mode to 2 increased the resolution to 3204x2406
// and output the file test__3204x2406_10_2.raw
Run Code Online (Sandbox Code Playgroud)

图像数据是粗略的8 bit,但漂浮在其中10 bit,较亮的图像可能使用较高的值而较暗的较低.这允许图像处理软件创建直方图并捕获图像的有用范围.由于光不是常数,因此也可能需要以不同的方式调整一个通道,以使图像看起来颜色正确.网上有很多关于色彩理论的信息,可以完全解释这一点,但新用户要注意,转换10 bit8快速深入.如果你想要漂亮的图片,请使用android图片捕获而不是原始图片!

格式表示位的拜耳模式.拜耳是一种格式,其中行和列的奇/偶值指示像素表示的颜色,其中每个像素的每个颜色通道RGB8 bit值,拜耳只有一个10 bit像素值,其中一个像素是红色,然后是接下来是绿色,红色,绿色,红色,绿色.然后下一行有蓝色,绿色,蓝色,绿色,蓝绿色.要确定RGB像素的值,需要解释周围​​的像素.

Format 2 has pixel order
//            0 1 2 3 4 5
//          0 G R G R G R
//          1 B G B G B G
//          2 G R G R G R
//          3 B G B G B G
Run Code Online (Sandbox Code Playgroud)

格式3的像素顺序为

//            0 1 2 3 4 5
//          0 R G R G R G
//          1 G B G B G B
//          2 R G R G R G
//          3 G B G B G B
Run Code Online (Sandbox Code Playgroud)

我不确定这种技术是否适用于其他机器人,或者它是否适用于未来的机器人.如果有人试图这样做,请添加成功或失败的评论.我的手机是直接中国进口解锁iHTC Android手机已根植.