用Shader實現的YUV到RGB轉換

2021-06-06 12:25:31 字數 849 閱讀 4317

本文由鏽水管原創。

網上有很多yuv到rgb的轉化程式,不過他們基本上都是基於cpu進行計算,基於cpu計算大體上有一下的一些方法,最原始的肯定是根據轉換公式直接進行浮點運算,要想提高速度,可以用左移和右移操作,將浮點運算變成整數運算,這樣轉化的速度會成倍的提高。另外還可以用查表法,因為yuv都是在0~255之間,他們總是有範圍的,先生成乙個很大的查詢表,直接對每乙個yuv分量查詢出rgb值,當然這個查詢表會很大,可以用部分查詢的方法來縮小查詢表的容量。

用cpu計算比較好的方法就是利用cpu的sse指令,有乙個專門的名詞是來形容sse的,那就是「單指令流多資料流」,意思就是他可以一次對多個資料進行計算,當然速度是非常快的。

在這裡,我主要寫一下我用shader做轉化的方法,首先,當然是介紹一下yuv:

windows下yuv格式的介紹在msdn上介紹的非常全面。yuv的格式有很多種,有444,422,420之分,並且每一種具體的格式也有許多不同的標準。具體在msdn的以下位址上有詳細的介紹:

不過對於寫程式來說,我只關心每種格式的記憶體布局方式。

yuv分為打包格式(packed)和平面格式(planar),平面格式中yuv的每個分量是分開儲存的,一般先儲存所有的y分量,再儲存所有的u分量,然後儲存所有的v分量;打包方式則是yuv的每個分量並沒有分開儲存,而是儲存在一起。例如:

平面格式,420中的imc4格式:

最終效果,其中程式框架就是上次我寫的mfc的框架:

使用Shader實現YUV到RGB的轉換

網上有很多yuv到rgb的轉化程式,不過他們基本上都是基於cpu進行計算,基於cpu計算大體上有一下的一些方法,最原始的肯定是根據轉換公式直接進行浮點運算,要想提高速度,可以用左移和右移操作,將浮點運算變成整數運算,這樣轉化的速度會成倍的提高。另外還可以用查表法,因為yuv都是在0 255之間,他們...

在OpenCV中實現YUV420sp2RGB

使用opencv內部函式cvcvtcolor 對應opencv2函式名為cvtcolor 可方便地實現rgb與yuv420兩種格式之間的相互轉換。但在轉換過程中,我們需要關心yuv420的內部資料結構,即對於一張width height的彩色來說,它的資料大小為width height 1.5,其中...

YUV格式到RGB格式的轉換

yuyv格式到rgb格式的轉換 yuyv格式如下 y0u0y1v0 y2u1y3v1.說明 乙個y代表乙個畫素,而乙個y和uv組合起來構成乙個畫素,所以第0個畫素y0和第乙個畫素y1都是共用第0個畫素的u0和v0。而每個分量y,u,v都是占用乙個位元組的儲存空間。所以y0u0y1v0相當於兩個畫素,...