2010-06-29 75 views
1

我需要知道如何將yuv420p格式的圖像旋轉90度。將其轉換爲rgb,旋轉並再次轉換爲yuv的選項不可行。即使算法也會有所幫助。如何旋轉yuv420數據?

Regards, Anirudh。

+0

你是否能夠解決這個問題,我一直面臨類似的問題,http://stackoverflow.com/questions/10735784/android-honeycomb-camera-orientation – Amitg2k12 2012-05-24 13:58:09

回答

1

我想這不是planar YUV,如果它已經很容易了(跳過第一步和最後一步)。你打算有YUV 4:2:0平面,但是我不明白你爲什麼有困難。

  1. 將其轉換爲平面首先:爲平面分配空間並根據您的packed YUV格式將字節分配到正確的位置。
  2. 分別旋轉Y,U,V平面。每個塊的「顏色」(U,V)信息應保持不變。
  3. 重組的飛機reobtain你必須在一開始

這一直工作正常,如果你的圖像尺寸是多重的4.如果沒有,那麼照顧的權利packed YUV ...

+0

所以,如果w * h(假設它是4)是圖像的分辨率,我可以將數組中的第一個w * h元素作爲Y平面,將下一個w * h/2作爲U並將其餘部分作爲V?爲了實現90度的旋轉,我可以將這些值分別轉置。這將使算法非常簡單! – aniait 2010-06-30 11:38:38

+2

這是正確的,但採用4:2:0子採樣U平面大小爲w * h/4而不是w * h/2。如果格式不匹配,答案中的鏈接應該爲您提供更多細節,這些YUV格式中有很多! – jdehaan 2010-06-30 12:06:53

+0

@jdehaan:如何指定YUV數據的地址。單個飛機的起始和結束指針? – 2011-12-29 07:13:05

0

我想YUV420p確實是平面的。

試着看看AviSynth的源代碼。轉(旋轉)的功能是在turn.cpp和turnfunc.cpp

http://www.avisynth.org/

+0

謝謝,會嘗試相同的。 – aniait 2010-06-30 11:35:52

1

萬一圖像是YUV420平面的,這是在圖像數據的編碼方式。 平面的意思是y部分是第一個,然後是U部分,然後是V部分。

考慮圖像w的寬度和圖像h的高度。

  1. 圖像的總大小是W * H * 3/2

  2. 在Y部分也被稱爲發光佔據W * H。

  3. Y節中每個2x2塊都有一個U像素和V像素。

  4. 接下來的U部分佔據(w/2)*(h/2)並放置在從圖像開始的偏移w * h處。 (w * h)+((w * h)/ 4)的偏移量,並且佔據(w/2)*(h/2)並且位於(w * h)+((w * h)/ 4)的偏移處。

爲了通過旋轉90度的圖像,則基本上這個W * H陣列複製到h *的陣列瓦特

如上訊息中提到,你只需要複製的每個的3以上Y,U,V分別封鎖。

  1. 從Y部分開始。要複製的第一個像素位於源陣列中的(h-1)* w處,將其複製到目標陣列的(0,0)。第二個像素在(h-2)* w等等...

  2. 記住,U和V的部分僅是(W/2)*(H/2)

  3. 接着複製U段。要複製的第一個像素在源陣列中的(w * h)+(((h/2)-1)*(w/2)),將其複製到(h * w)+(0,0)in目標陣列。 (w * h)+(((h/2)-2)*(w/2))等等...

  4. 最後複製V部分。要複製的第一個像素在源陣列中的((w * h)+(w * h/4))+(((h/2)-1)*(w/2)),將其複製到(h * w)+(w * h/4)+(0,0)。第二個像素在((w * h)+(w * h/4))+(((h/2)-2)*(w/2)),等等...

以這種方式獲得的目標數組包含90度旋轉的圖像。