在onPictureTaken中使用原始imageData

时间:2012-03-31 15:08:24

标签: android ocr android-camera

我已经实现了使用相机拍照的功能。而不是存储它我想做一些简单的图片处理(非常简单的OCR - 主要是尝试自己的能力来处理这样的任务),我需要转换imageData in     public void onPictureTaken(byte [] imageData,Camera c) 进入灰度--2d字节数组。 我找到的唯一代码示例是使用bitmapFactory(Image Processing on Android)将图像转换为位图。 我的问题是 - 有人可以就所有原始格式以及如何从中提取数据提出建议吗?或者我最好的猜测是获取位图并将其缩小到2d字节数组?

非常感谢有关该主题的任何链接。

3 个答案:

答案 0 :(得分:1)

我意识到这个答案有点晚了,但这是我在过去一个月里学到的,同时使用相机。

无论您是通过 onPictureTaken 还是 onPreviewFrame 接收原始图像数据,它都可以以各种不同的格式编码(android.graphics.ImageFormat)。唯一一个保证普遍支持(根据文档)是NV21,YV12是蜂窝和普遍支持的。除了得到普遍支持外,NV21可能非常适合您要做的事情(转换为黑白)。 NV21是YUV格式,其中Y通道携带光度信息,而U和V通道携带颜色信息。请在此处查看更正式的说明:

http://en.wikipedia.org/wiki/YUV
http://www.fourcc.org/fccyvrgb.php
http://www.fourcc.org/yuv.php#NV21

wiki链接有一个实现NV21-> RGB转换的示例源(不是很有效,但是很好地了解了一般方法)。如果您对使用C或汇编进行此转换感兴趣,这是一个很好的信息来源(警告:NV21没有代码,我处理NV21的快速修改没有任何好处)。然而,它展示了如何将.S文件合并到ndk项目中,这实际上非常简单。

http://www.roman10.net/effective-color-conversion-yuv-rgb-in-android-in-assembly/

回到你的问题 - 转换为黑白。只需将Y通道和RGB三元组形成为[Y,Y,Y],即可获得黑白图像。或者可以简单地从其中制作L8图像(例如,Y-> L)。

<强> PS。 关于在转换为RGB期间YUV值的范围/缩放存在很多混淆。我发现相机数据是全摆幅(0-255,而不是16-235或16-240),并且在矩阵乘法后将结果钳位到0-255会产生视觉上令人满意的结果,同时缩放到0-255度扭曲颜色(不用说,如果你扩展到其他范围,例如16-240,这仍然是正确的)。这些观察结果似乎违背了上述链接中描述的完整转换过程的一些细微方面,但这就是我发现的工作。

答案 1 :(得分:0)

走到黑暗面 - 我们有饼干:

http://sourceforge.net/projects/javaocr/

...还在android上运行OCR。没有实际的geature版本,所以请查看源代码库。随意加入开发人员列表并在那里提问(以及cource为项目做出贡献)

答案 2 :(得分:0)

可能这个答案对于该主题的作者没有用,但对于其他人来说,如何将相机原始数据用于他/她自己的目的可能会很有趣。这是ffmpeg。它可以编译为Android。例如,有一个项目可以提供一种方法。 https://github.com/guardianproject/android-ffmpeg-java https://www.ffmpeg.org/ Android摄像头可以通过此命令提供ffmpeg ffmpeg -f rawvideo -pixel_format nv21 -video_size 320x240 -framerate 15