android yuv轉RGB通道的各種問題彙總

NO IMAGE

前段時間公司準備用安卓手機來測試一個AI演算法的執行效率,任務落在了我這個程式雜員的頭上,對於之前安卓2-3開發用的低版本SDK且主要是做業務類應用程式的人來說,無疑又是一種挑戰,從熟悉捕獲影象,再到影象通道處理,再到安卓各版本許可權的處理,不好意思的說整了很多年花式程式的我,還是花了不少的時間(國內的資料太少了)。

言歸正傳:

百度查了一下,很多朋友弄安卓的攝像頭採集應該是用了一個camera的方法,果斷的開始用camera來嘗試,但當發現安卓6以上支援camera2且camera2的執行效率更高更穩定,從程式設計師的強迫症上來說,我果斷的使用了camera2,但是問題來了,抄了網上很多程式碼結果發現還是要每行的去翻譯一遍,因為業務需求不同,且camera2的方法設計似乎和以往的物件導向的方法略有不同,於是花了點時間處理了這個問題,這時候問題又來了,同事給的SO庫採集的N21格式,在camera下面似乎能夠很順利的做互動,但是在camera2下面,不支援N21格式,IDE並不報錯,但是執行之後log裡面會有提示。於是又在網上找資料,camera2只支援JEPG,YV12,YUV_420_888這三種格式的資料轉換,,翻閱各種,總算是對應上了,YUV_420_888對應NV21,然後找了個demo來用,花線居然後轉成RGB之後居然是綠色和粉紅色交錯的,醉了。

百度了半天,然後FQ出去找了很久,最終在一個國外的小技術論壇上面發現了高人的賜教,“你通道數不對,阿門!”

Image.Plane Y = image.getPlanes()[0];//Y通道
Image.Plane U = image.getPlanes()[1];//U通道
Image.Plane V = image.getPlanes()[2];//V通道
int Yb = Y.getBuffer().remaining();
int Ub = U.getBuffer().remaining();
int Vb = V.getBuffer().remaining();
byte[] data = new byte[Yb   Ub   Vb];
Y.getBuffer().get(data, 0, Yb);
U.getBuffer().get(data, Yb, Ub);
V.getBuffer().get(data, Yb  Ub, Vb);

開始我以為是個陣列,結果原來是這麼回事!看來還是得重新梳理一下整合程式的習慣。