如何从Android摄像头捕获原始图像

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

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

解决方法

android(至少我的)有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);

生成文件的实际名称修改包括正在生成的原始文件的参数.对于我的一个机器人,产生的名称是“test__1604x1206_10_2.raw”,它是a1 1604×1206图像,10bit格式2.和“test__1284x966_10_3.raw”,它是1284×966图像,10位格式3. 10个字节存储为2个字节短int(小端).

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

图像数据大约为8位,但在10位内浮动,其中较亮的图像可能使用较高的值,并且较暗.这允许图像处理软件创建直方图并捕获图像的有用范围.因为光不是恒定的,所以也可能需要调整一个通道与另一个通道不同,以使图像看起来颜色正确.网络上有很多关于颜色理论的信息,可以充分解释这一点,但是新用户需要注意的是,10位到8位的转换速度很快.如果你想要一个漂亮的图片,使用Android图片捕获,而不是原始图像!

格式表示位的拜耳模式.拜耳是一种格式,其中行和列的奇数/偶数值表示像素表示哪种颜色,其中RGB对于每个像素的每个颜色通道具有8位值,拜耳对像素只有一个10位值,其中一个像素是红色,然后是下一个绿色,红色,绿色,绿色.那么下一行就有蓝色,蓝色,蓝绿色.要确定像素的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

格式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

我不知道这种技术是否适用于其他机器人,或者它将在未来的机器人上工作.如果有人尝试这个,请添加一个关于成功或失败的评论.我的手机是直接中国进口解锁iHTC Android手机已经扎根.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...