luvcview原始碼之YUV轉RGB

2021-09-16 18:24:25 字數 1508 閱讀 4994

rgb是一種影象格式,是影象最原始的色彩,顯示、處理和識別也都是基於rgb格式,而一般攝像頭常用的輸出格式是yuv,要對攝像頭影象顯示和處理第一步就要把yuv轉換為rgb。

yuv有幾種格式,比如yuv444,yuv422,yuv420等(rgb也有多種格式比如rgb444、rgb565、rgb888,還有紅藍基交換bgr等等,這些在網上有很多資料)。

使用luvcview查詢攝像頭輸出格式為yuv422:

yuv422->rgb24 變換關係:

yuv422格式是y0u0y1v0,2個y分量共用一組uv,y0、u0、v0計算得到r0、g0、b0,y1、u0、v0計算得到r1、g1、b1。

公式裡有浮點計算,我們可以優化,網上看到一位網友的部落格很有啟發

對比結果查表效率最高,把r、g、b中乘法部分從0~255全部計算好放入陣列,通過查表得到乘積。

具體**:

luvcview中yuv422->rgb24函式:

其中

size = image_width * image_height /2;
這裡除以2是因為每次for迴圈能得到2個rgb畫素,故迴圈次數減半。

r_fromyv、r_fromyuv、r_fromyu定義:

其中clip()是保證括號內的計算結果在0-255之間的巨集:

#define clip(color) (unsigned char)(((color)>0xff)?0xff:(((color)<0)?0:(color)))

可以看到r_fromyv、r_fromyuv、r_fromyu是對應上面yuv422->rgb24 變換關係,

lutrv、lutgu、lut**、lutbu是四段動態申請的記憶體,裡面存放著yuv422->rgb24中乘法部分的計算結果:

1、申請4段長度為256的記憶體,存放查表資料

2、把0~255帶入計算生成查表,浮點運算用整型運算代替再轉浮點,實際計算可以轉換如下:

lutrv[i] = (i-128)*1.402;

lutbu[i] = (i-128)*1.772;

lutgu[i] = (128-i)*0.714;

lut**[i] = (128-i)*0.344;

最後退出執行要記得釋放記憶體:

void freelut(void)
乘法運算被查表替代,以空間換時間,提公升了效率。

以上擷取的**分別出自utils.c和color.c。

原始碼解析 JDK原始碼之LinkedHashMap

linkedhashmap原始碼,基於 jdk1.6.43 他繼承了hashmap,並且實現了插入和訪問的有序功能 public class linkedhashmapextends hashmapimplements map 其也有乙個entry內部類,繼承了 hashmap 的entry 內部類...

原始碼閱讀 Glide原始碼閱讀之with方法(一)

前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...

Spring原始碼解析之 Aop原始碼解析(2)

spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...