我試圖從相機預覽捕捉圖像並對其進行一些繪製。問題是,我只有大約3-4fps的繪圖,並且一半的幀處理時間是從相機預覽接收和解碼NV21圖像並轉換爲位圖。我有一個代碼來完成這個任務,我在另一個堆棧問題上找到了。它似乎並不快,但我不知道如何優化它。 Samsung Note 3大約需要100-150 ms,圖像尺寸爲1920x1080。我怎樣才能讓它工作得更快?Yuv(NV21)圖像轉換爲位圖
代碼:
public Bitmap curFrameImage(byte[] data, Camera camera)
{
Camera.Parameters parameters = camera.getParameters();
int imageFormat = parameters.getPreviewFormat();
if (imageFormat == ImageFormat.NV21)
{
YuvImage img = new YuvImage(data, ImageFormat.NV21, prevSizeW, prevSizeH, null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
img.compressToJpeg(new android.graphics.Rect(0, 0, img.getWidth(), img.getHeight()), 50, out);
byte[] imageBytes = out.toByteArray();
return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
}
else
{
Log.i(TAG, "Preview image not NV21");
return null;
}
}
圖像的最終格式必須是位圖,這樣的話我可以做它的處理。我試圖將Camera.Parameters.setPreviewFormat設置爲RGB_565,但無法將相機參數分配給相機,我也讀過NV21是唯一可用的格式。我對此不確定,是否有可能在這些格式變化中找到解決方案。
預先感謝您。
最快的方法是使用RenderScript內在,但問題是爲什麼你需要這麼多的位圖每秒?繪製這些位圖或存儲它們將成爲流量的下一個瓶頸,速度爲10 FPS或更少 –
謝謝。我的任務是在相機預覽的文本字段周圍繪製矩形,所以當相機移動時,我想讓文本字段周圍的邊界保持移動,並在新找到的文本字段周圍查找和繪製矩形(因此,跟蹤在此處不起作用) 。這是我第一次做這樣的事情,比如實時畫相機預覽,所以也許你有任何建議或意見,也許我在這裏做了一些非常錯誤的事情? –
考慮通過OpenGL渲染矩形;您不能顯示SurfaceTexture來渲染相機預覽,因爲您的矩形將以延遲顯示(識別和追蹤算法)。更好地使用着色器手動呈現YUV預覽幀,完美地與您的矩形同步。也許您的識別和跟蹤算法也可能被調整爲依賴於YUV數據而不是RGB? –