`
李光正
  • 浏览: 28779 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android yuv摄像

阅读更多
http://eyehere.net/2011/android-camera-2/

在应用里,不需要把拍下来的图片存储,只需要把预览的图片数据处理一下就好,很自然的我只是用了onPreviewFrame调用,考虑处理传递进来的data数据流就是了。

网上很多帖子都说,然后用BitmapFactory的decodeByteArray()函数来解析图片就行了,我试了一下,发现这真是彻头彻尾的谎言,data字节流默认是YCbCr_420_SP(虽然可以改,但其他的格式未必兼容),decodeByteArray()压根儿不认!SDK2.2之后,似乎提供了一个YuvImage的类来转一下(那Google一开始提供这个借口是做什么的?),难道就要把老机给抛弃了么??万万不能啊(穷人最理解穷人们了)!

好在这个世界总是不缺少好人和牛人的,有人提供了这么一段转换的代码:
static public void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {    final int frameSize = width * height;     for (int j = 0, yp = 0; j < height; j++) {        int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;        for (int i = 0; i < width; i++, yp++) {            int y = (0xff & ((int) yuv420sp[yp])) - 16;            if (y < 0) y = 0;            if ((i & 1) == 0) {                v = (0xff & yuv420sp[uvp++]) - 128;                u = (0xff & yuv420sp[uvp++]) - 128;            }             int y1192 = 1192 * y;            int r = (y1192 + 1634 * v);            int g = (y1192 - 833 * v - 400 * u);            int b = (y1192 + 2066 * u);             if (r < 0) r = 0; else if (r > 262143) r = 262143;            if (g < 0) g = 0; else if (g > 262143) g = 262143;            if (b < 0) b = 0; else if (b > 262143) b = 262143;             rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);        }    }}


不是很清楚这里面的原理,但是它能在我这里工作,暂时可以了……然后你才可以吧处理完的rgb[]传给decodeByteArray()。

顺便好心的把使用SDK2.2之后的也贴上
public void onPreviewFrame(byte[] data, Camera arg1) {
    FileOutputStream outStream = null;
    try {
        YuvImage yuvimage = new YuvImage(data,ImageFormat.NV21,arg1.getParameters().getPreviewSize().width,arg1.getParameters().getPreviewSize().height,null);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        yuvimage.compressToJpeg(new Rect(0,0,arg1.getParameters().getPreviewSize().width,arg1.getParameters().getPreviewSize().height), 80, baos);
 
        outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));
        outStream.write(baos.toByteArray());
        outStream.close();
 
        Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    }
    Preview.this.invalidate();
}


得到的图像旋转了90°(似乎有的机型设置一下setRotation(90)可以搞定,但还是那句话,不通用啊,况且这个是2.1之后的API)。手动转一下吧……
Matrix matrix = new Matrix();matrix.postRotate(90);// 这里的rgb就是刚刚转换处理的东东Bitmap bmp = Bitmap.createBitmap(rgb, 0, w, w, h, Bitmap.Config.ARGB_4444);Bitmap nbmp = Bitmap.createBitmap(bmp,                0, 0, bmp.getWidth(),  bmp.getHeight(), matrix, true);


考虑到需要做识别,自然得先把它转成灰度图像,经典心理公式Gray = R*0.299 + G*0.587 + B*0.114出场了,但是手机的计算速度不那么快,这样的浮点运算还是尽量避免吧~ 于是考虑Gray = (R*299 + G*587 + B*114 + 500) / 1000或者Gray = (R*30 + G*59 + B*11 + 50) / 100。但是除法总是还是不够快,用移位吧……Gray = (R*19595 + G*38469 + B*7472) >> 16,稍微小一点,用Gray = (R*38 + G*75 + B*15) >> 7也足够了。

分享到:
评论
1 楼 ihopethatwell 2012-07-18  
到处都是转载的,楼主,你这个图片这个调用能贴上?

相关推荐

    AndroidUSBCamera,通用uvccamera库,支持录制、推送等功能.zip

    androidusbcamera是在saki4510t/uvc camera的基础上开发的,usb摄像机(uvc设备)项目和视频数据采集的使用都是高度封装的,它可以通过几个简单的api帮助开发者轻松使用usb摄像机设备。通过使用androidusbcamera,您...

    gc2035_yuv.zip_android_gc2035_gc2035 linux

    这个压缩包文件包含了用于Android智能手机上的MediaTek处理器平台的GC2035摄像头驱动,驱动程序的核心功能是管理GC2035传感器,处理YUV视频数据,同时与Android系统中的其他组件无缝协作,为用户提供流畅的摄影体验...

    android摄像上传PC并显示

    在Android平台上,实现摄像上传至PC并实时显示是一项常见的需求,尤其在远程监控或设备间协同工作的场景下。本文将详细解析这一过程的关键技术点,包括Android端的图像捕获、数据封装、Socket通信,以及PC端的数据...

    android 使用GLsurfaceView 自定义相机

    在Android平台上,自定义相机是一项常见的需求,尤其是在开发复杂或者高性能的图像处理应用时。`GLSurfaceView`是Android提供的一种高效方式,用于渲染OpenGL ES图形。本篇将深入探讨如何利用`GLSurfaceView`来实现...

    Android摄像头RTMP推流

    为了从摄像头捕获数据,我们需要设置Surface作为Camera2 API的预览目标,然后在Surface回调中获取每一帧的NV21或YUV420SP格式的原始数据。将这些数据转换成FFMPEG可接受的格式,例如I420或YUVJ420P,再通过FFMPEG的...

    android摄像

    在Android平台上,摄像功能是通过Android的Camera API来实现的。Android SDK提供了丰富的接口和类,使得开发者可以灵活地控制摄像头进行拍照、录制视频等操作。在这个“android摄像”项目中,开发者遇到了一个问题:...

    Android源码——PC机摄像头摄像数据在Android手机上同步显示的源.zip

    该压缩包文件“Android源码——PC机摄像头摄像数据在Android手机上同步显示的源.zip”包含了一个Android项目,该项目的目的是实现一个功能,即通过网络将PC机的摄像头摄像数据实时传输并显示在Android手机上。...

    android 4.4 Camera2

    Android 4.4引入了一个全新的相机API,即Camera2 API,这是一个针对专业摄影师和开发者设计的高级相机接口。Camera2 API旨在提供更多的控制权,更好的性能以及更丰富的功能,使得开发者能够创建出更加复杂的相机应用...

    android一个采集图像 并可以把预览回调传回数据做处理

    在Android平台上,开发一款应用程序来采集图像并进行实时处理是一项常见的任务,特别是在摄像头应用或图像分析项目中。本文将深入探讨如何实现这个功能,重点在于理解Android的相机API以及如何设置预览回调来处理...

    4.0android之camera

    在Android系统中,Camera API是开发者用来访问和控制设备摄像头的关键接口。在Android 4.0(API级别14)时,系统引入了一些重要的改进和更新...理解和熟练运用这两个API对于Android应用开发尤其是摄影类应用至关重要。

    Android对焦拍照功能实现

    在Android应用开发中,实现对焦和拍照功能是常见的需求,尤其在开发摄影类或社交类应用时。本文将详细讲解如何在Android中实现在点击屏幕后进行对焦并拍照的功能。 首先,我们需要理解Android的相机API。Android...

    h264编解码for android app源码

    在Android平台上,H264编解码技术是视频处理中的关键部分,尤其在实时通信、视频直播或者IPC(Internet Protocol Camera,网络摄像机)应用中。本项目提供了H264编解码的源码,帮助开发者实现从Camera获取的YUV数据...

    android 简易camera照相机

    shutterCallback在快门动作时触发,rawCallback处理原始YUV数据,jpegCallback处理JPEG格式的图片数据。 5. **处理拍照结果**:在jpegCallback中,我们通常会将JPEG数据保存到本地文件,或者进行进一步处理,如上传...

    Android摄像头采集H264及H264解码播放

    在Android平台上,摄像头采集H264数据并进行解码播放是移动开发中常见的应用场景,...提供的压缩包文件“Android摄像解码播放”可能包含了示例代码和资源,供你参考和学习。记得根据具体需求和设备特性进行调整和优化。

    android自定义相机连拍

    本教程将探讨如何在Android应用中实现自定义相机的连拍功能,这对于摄影爱好者或者需要快速捕捉连续画面的场景非常有用。我们将讨论以下几个关键知识点: 1. **创建Camera Preview**:在自定义相机中,首先需要创建...

    Android 原生Camera

    在Android应用开发中,理解并掌握原生Camera API对于创建高质量的摄影类应用至关重要。以下将详细介绍Android原生Camera的相关知识点: 1. **Camera API**: Android原生Camera API分为两个版本:Camera1(旧版)...

    android8.0_Camera深入分析

    Android 8.0支持多种图像格式和缓冲区配置,包括YUV、JPEG和RAW。开发者可以根据应用需求选择最适合的格式,如实时预览、高速连拍或后期处理。 6. 同步框架 新版本中引入了同步框架,可以同步多个摄像头操作,例如...

    android拍照源代码

    - `ImageReader`:接收相机捕获的图像数据,支持多格式输出,如JPEG或YUV。 在"790808798camera1"源代码中,我们可以看到以下几个关键点: 1. **权限管理**: - AndroidManifest.xml中需要添加`&lt;uses-feature&gt;`...

    android source code:Camera.zip

    9. **Reprocessing**:在Camera2 API中,可以对原始图像数据进行后期处理,比如通过YUV到RGB转换、HDR合成等,这在`android.media.Image`和`android.media.ImageReader`中实现。 10. **权限管理**:Android系统对...

Global site tag (gtag.js) - Google Analytics