2011-04-12 27 views
23

我正在嘗試創建一個可以實時處理相機幀的Android應用程序。首先,我只想顯示相機看到的灰度版本。我設法從onPreviewFrame方法的字節數組中提取適當的值。下面僅僅是一個我的代碼片斷:實時處理Android相機幀

byte[] pic; 
int pic_size; 
Bitmap picframe; 
public void onPreviewFrame(byte[] frame, Camera c) 
{ 
    pic_size = mCamera.getParameters().getPreviewSize().height * mCamera.getParameters().getPreviewSize().width; 
    pic = new byte[pic_size]; 
    for(int i = 0; i < pic_size; i++) 
    { 
     pic[i] = frame[i]; 
    } 
    picframe = BitmapFactory.decodeByteArray(pic, 0, pic_size); 
} 

byte[]幀陣列的第一[width*height]值是亮度(灰度)值。一旦我提取了它們,我如何將它們作爲圖像顯示在屏幕上?它不是一個二維數組,所以如何指定寬度和高度?

回答

10

您可以從OpenCV4Android SDK得到廣泛的指導。看看他們可用的例子,具體來說就是Tutorial 1 Basic. 0 Android Camera

但是,對於我來說,對於密集的圖像處理來說,這會比實時圖像處理應用程序的可接受的慢。 一個好的替代其onPreviewFrame的字節陣列轉換到YUVImage:

YuvImage yuvImage = new YuvImage(frame, ImageFormat.NV21, width, height, null);

創建一個矩形的尺寸與圖像相同。

創建一個ByteArrayOutputStream並通過此,矩形和壓縮值compressToJpeg():

ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(imageSizeRectangle, 100, baos);

byte [] imageData = baos.toByteArray();

Bitmap previewBitmap = BitmapFactory.decodeByteArray(imageData , 0, imageData .length);

表面上渲染這些previewFrames和所涉及的最佳做法是一個新的方面。 =)

+1

這是否發生將YUV圖像轉換爲帶中介JPEG的位圖?幾乎沒有一個可行的實時解決方案 – Rekin 2014-01-03 19:58:15

+0

我強烈建議不要這樣做。 android上的OpenCV會增加項目的複雜性,並且還需要大小約爲10mb的本地庫。 Android確實擁有完成OP所需要的所有功能。 OpenCV是一個偉大的圖書館,但對這種情況矯枉過正。 – protectedmember 2015-09-29 18:37:08

-2

使用當前的Android工具/ API可以實現這並非易事。一般來說,實時圖像處理在NDK級別上可以更好地完成。爲了顯示黑色和白色,你仍然可以用java來做。包含幀數據的字節數組是YUV格式,其中Y平面最先出現。所以,如果你只有Y平面(第一寬度x高度字節),它已經給你黑色和白色。

我通過廣泛的工作和試驗達到了這個目標。你可以在谷歌瀏覽應用程序: https://play.google.com/store/apps/details?id=com.nm.camerafx

1

這個很老的帖子現在引起了我的注意。

'11中可用的API受限得多。今天可以使用SurfaceTexture(見example)在(某些)操作之後預覽相機流。