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...