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也足够了。
分享到:
相关推荐
androidusbcamera是在saki4510t/uvc camera的基础上开发的,usb摄像机(uvc设备)项目和视频数据采集的使用都是高度封装的,它可以通过几个简单的api帮助开发者轻松使用usb摄像机设备。通过使用androidusbcamera,您...
这个压缩包文件包含了用于Android智能手机上的MediaTek处理器平台的GC2035摄像头驱动,驱动程序的核心功能是管理GC2035传感器,处理YUV视频数据,同时与Android系统中的其他组件无缝协作,为用户提供流畅的摄影体验...
在Android平台上,实现摄像上传至PC并实时显示是一项常见的需求,尤其在远程监控或设备间协同工作的场景下。本文将详细解析这一过程的关键技术点,包括Android端的图像捕获、数据封装、Socket通信,以及PC端的数据...
在Android平台上,自定义相机是一项常见的需求,尤其是在开发复杂或者高性能的图像处理应用时。`GLSurfaceView`是Android提供的一种高效方式,用于渲染OpenGL ES图形。本篇将深入探讨如何利用`GLSurfaceView`来实现...
为了从摄像头捕获数据,我们需要设置Surface作为Camera2 API的预览目标,然后在Surface回调中获取每一帧的NV21或YUV420SP格式的原始数据。将这些数据转换成FFMPEG可接受的格式,例如I420或YUVJ420P,再通过FFMPEG的...
在Android平台上,摄像功能是通过Android的Camera API来实现的。Android SDK提供了丰富的接口和类,使得开发者可以灵活地控制摄像头进行拍照、录制视频等操作。在这个“android摄像”项目中,开发者遇到了一个问题:...
该压缩包文件“Android源码——PC机摄像头摄像数据在Android手机上同步显示的源.zip”包含了一个Android项目,该项目的目的是实现一个功能,即通过网络将PC机的摄像头摄像数据实时传输并显示在Android手机上。...
Android 4.4引入了一个全新的相机API,即Camera2 API,这是一个针对专业摄影师和开发者设计的高级相机接口。Camera2 API旨在提供更多的控制权,更好的性能以及更丰富的功能,使得开发者能够创建出更加复杂的相机应用...
在Android平台上,开发一款应用程序来采集图像并进行实时处理是一项常见的任务,特别是在摄像头应用或图像分析项目中。本文将深入探讨如何实现这个功能,重点在于理解Android的相机API以及如何设置预览回调来处理...
在Android系统中,Camera API是开发者用来访问和控制设备摄像头的关键接口。在Android 4.0(API级别14)时,系统引入了一些重要的改进和更新...理解和熟练运用这两个API对于Android应用开发尤其是摄影类应用至关重要。
在Android应用开发中,实现对焦和拍照功能是常见的需求,尤其在开发摄影类或社交类应用时。本文将详细讲解如何在Android中实现在点击屏幕后进行对焦并拍照的功能。 首先,我们需要理解Android的相机API。Android...
在Android平台上,H264编解码技术是视频处理中的关键部分,尤其在实时通信、视频直播或者IPC(Internet Protocol Camera,网络摄像机)应用中。本项目提供了H264编解码的源码,帮助开发者实现从Camera获取的YUV数据...
shutterCallback在快门动作时触发,rawCallback处理原始YUV数据,jpegCallback处理JPEG格式的图片数据。 5. **处理拍照结果**:在jpegCallback中,我们通常会将JPEG数据保存到本地文件,或者进行进一步处理,如上传...
在Android平台上,摄像头采集H264数据并进行解码播放是移动开发中常见的应用场景,...提供的压缩包文件“Android摄像解码播放”可能包含了示例代码和资源,供你参考和学习。记得根据具体需求和设备特性进行调整和优化。
本教程将探讨如何在Android应用中实现自定义相机的连拍功能,这对于摄影爱好者或者需要快速捕捉连续画面的场景非常有用。我们将讨论以下几个关键知识点: 1. **创建Camera Preview**:在自定义相机中,首先需要创建...
在Android应用开发中,理解并掌握原生Camera API对于创建高质量的摄影类应用至关重要。以下将详细介绍Android原生Camera的相关知识点: 1. **Camera API**: Android原生Camera API分为两个版本:Camera1(旧版)...
Android 8.0支持多种图像格式和缓冲区配置,包括YUV、JPEG和RAW。开发者可以根据应用需求选择最适合的格式,如实时预览、高速连拍或后期处理。 6. 同步框架 新版本中引入了同步框架,可以同步多个摄像头操作,例如...
- `ImageReader`:接收相机捕获的图像数据,支持多格式输出,如JPEG或YUV。 在"790808798camera1"源代码中,我们可以看到以下几个关键点: 1. **权限管理**: - AndroidManifest.xml中需要添加`<uses-feature>`...
9. **Reprocessing**:在Camera2 API中,可以对原始图像数据进行后期处理,比如通过YUV到RGB转换、HDR合成等,这在`android.media.Image`和`android.media.ImageReader`中实现。 10. **权限管理**:Android系统对...