OpenCV學習3 yuv格式

2021-09-05 03:10:18 字數 1139 閱讀 8629

1.我們從android獲取到的原始幀資料是儲存在image中的。這些資料是以yuv格式存在image中的。

ps:為了統一android內部混亂的中間資料,在api21 引入了camera2,並且image作為相機得到原始幀資料的載體開始發揮作用。

yuv,分為三個分量,「y」表示明亮度(luminance或luma),也就是灰度值;而「u」和「v」 表示的則是色度(chrominance或chroma),作用是描述影像色彩及飽和度,用於指定畫素的顏色。

2.我們從image提供的方法中可以分別獲取y,u,v的資料。

yuv格式根據y,u和v在記憶體中存放的位置的不同又可以分為兩大類,planar和packed 。

對於planar的yuv格式,先連續儲存所有畫素點的y,緊接著儲存所有畫素點的u,隨後是所有畫素點的v。 

對於packed的yuv格式,每個畫素點的y,u,v是連續交*儲存的。

這裡主要以目前使用到的yuv420格式來說明,yuv420屬於planar格式,即先連續的儲存所有的y,緊接著儲存u和v。

yuv420是每4個點公用乙個uv。

詳細的yuv格式可以參考

3.不論何種格式的yuv資料,當我們拿到image的時候都已經被分別放到不同的陣列中了。

4.我們也可以只讀取y值儲存到中,這樣儲存出來的就是灰度

5.在opencv中我們的影象是儲存在mat的data區中的,所以我們要清楚的知道yuv的儲存格式,以便能夠把android的image中的y,u,v資料正確的儲存到mat的data區中,然後才可以使用其它介面去處理資料。

6.image的使用參考

7.需要注意的地方!!!!!

1.yuv影象的跨距可能跟影象的寬度不一樣,詳見 。對應到image中就是image.getplanes()[n].getrowstride(),這裡的rowstride可能比實際寬度大,但是有效資料跟實際寬度是一樣大的。

2.資料可能不是連續儲存的,要看image.getplanes()[n].getpixelstride(),值為1的時候才是連續儲存的。

參考:

YUV格式轉換為RGB(基於opencv)

opencv自帶cvcvtcolor,但是這種方法有bug,得到的會泛白。第二種方法是公式法。法一 opencv自帶cvcvtcolor void filewriteframes readme.close cvreleaseimage uuimg cvreleaseimage vvimg cvrel...

YUV格式轉換為RGB(基於opencv)

opencv自帶cvcvtcolor,但是這種方法有bug,得到的會泛白。第二種方法是公式法。法一 opencv自帶cvcvtcolor 說明 這種方法會出現 泛白 具體原因網上是說cvcvtcolor這個函式左右協議不同,不太懂。cpp view plain copy print void fil...

YUV422格式訊號格式 以備學習之用

yuv422格式,又分為很多小類,按照u v的排列可以有yuyv,yvyu,uyvy,vyuy四種,其中,yuyvy一般又稱作yuv2格式。而這四種yuv422格式,每種又可以分為2小類,按y和uv的排列可以有打包格式和平面格式。例如,乙個640 480 2的yuv檔案,打包格式就是yuyvyuyv...