# Camera OV7670 第08段 YUV ```javascript= /* uint8_t lineBuffer [lineBufferLength] uint8_t * lineBufferSendByte; const bool isSendWhileBuffering = true;//這是在緩衝時發送 uint16_t processedByteCountDuringCameraRead = 0;//相機讀取期間處理的字節數 inline void processNextGrayscalePixelByteInBuffer() __attribute__((always_inline));//處理緩衝區中的下一個灰度像素字節 inline uint8_t formatPixelByteGrayscaleFirst(uint8_t byte) __attribute__((always_inline));//優先格式化灰度像素字節 inline uint8_t formatPixelByteGrayscaleSecond(uint8_t byte) __attribute__((always_inline));//第二格式化灰度秒像素字節 */ void processGrayscaleFrameBuffered() { camera.waitForVsync(); commandDebugPrint("Vsync"); camera.ignoreVerticalPadding();//忽略垂直填充 for (uint16_t y = 0; y < lineCount; y++) { lineBufferSendByte = &lineBuffer[0]; camera.ignoreHorizontalPaddingLeft();//忽略左側水平填充 uint16_t x = 0; while ( x < lineBufferLength) { camera.waitForPixelClockRisingEdge(); // YUV422 grayscale byte 等待像素時脈上升緣 camera.readPixelByte(lineBuffer[x]); lineBuffer[x] = formatPixelByteGrayscaleFirst(lineBuffer[x]); camera.waitForPixelClockRisingEdge(); // YUV422 color byte. Ignore.忽視 if (isSendWhileBuffering) { processNextGrayscalePixelByteInBuffer(); } x++; camera.waitForPixelClockRisingEdge(); // YUV422 grayscale byte camera.readPixelByte(lineBuffer[x]); lineBuffer[x] = formatPixelByteGrayscaleSecond(lineBuffer[x]); camera.waitForPixelClockRisingEdge(); // YUV422 color byte. Ignore.忽視 if (isSendWhileBuffering) { processNextGrayscalePixelByteInBuffer(); } x++; } camera.ignoreHorizontalPaddingRight(); // Debug info to get some feedback how mutch data was processed during line read. //Debug info以獲得一些回授,在讀取時間(行)時處理了多少數據。 processedByteCountDuringCameraRead = lineBufferSendByte - (&lineBuffer[0]); // Send rest of the line while (lineBufferSendByte < &lineBuffer[lineLength]) { processNextGrayscalePixelByteInBuffer(); } }; } ``` ## YUV - Y'UV的發明是由於彩色電視與黑白電視的過渡時期。 黑白視訊只有Y(Luma,Luminance)視訊,也就是灰階值。 到了彩色電視規格的制定,是以YUV/YIQ的格式來處理彩色電視圖像, 把UV視作表示彩度的C(Chrominance或Chroma), 如果忽略C訊號,那麼剩下的Y(Luma)訊號就跟之前的黑白電視訊號相同, 這樣一來便解決彩色電視機與黑白電視機的相容問題。Y'UV最大的優點在於只需佔用極少的頻寬。 - 因為UV分別代表不同顏色訊號,所以直接使用R與B訊號表示色度的UV。 也就是說UV訊號告訴了電視要偏移某象素的的顏色,而不改變其亮度。 或者UV訊號告訴了顯示器使得某個顏色亮度依某個基準偏移。 UV的值越高,代表該像素會有更飽和的顏色。 - Y′UV, YUV, YCbCr, YPbPr所指涉的範圍,常有混淆或重疊的情況。從歷史的演變來說,其中YUV和Y'UV通常用來編碼電視的類比訊號,而YCbCr則是用來描述數位的影像訊號,適合影片與圖片壓縮以及傳輸,例如MPEG、JPEG。 但在現今,YUV通常已經在電腦系統上廣泛使用。 Y'代表明亮度(luma; brightness) U與V儲存色度(色訊; chrominance; color)部分; 亮度(luminance)記作Y,而Y'的prime符號記作伽瑪校正。 - YUV也可以稱為YCbCr,雖然這些術語定義略有不同,但它們往往會混淆並可互換使用。 - Y表示亮度分量:如果只顯示Y的話,圖像看起來會是一張黑白照。 U(Cb)表示色度分量:B-Y,圖像藍色部分去掉亮度,反映了RGB輸入信號藍色部分與RGB信號亮度值之間的差異。 V(Cr)表示色度分量:R-Y,圖像紅色部分去掉亮度,反映了RGB輸入信號紅色部分與RGB信號亮度值之間的差異。 - . YUV Formats分成兩個格式: - 緊縮格式(packed formats):將Y、U、V值儲存成Macro Pixels陣列,和RGB的存放方式類似。 平面格式(planar formats):將Y、U、V的三個分量分別存放在不同的矩陣中。 - 緊縮格式(packed format)中的YUV是混合在一起的, 對於YUV4:2:2格式而言,用緊縮格式很合適的,因此就有了UYVY、YUYV等。 - 平面格式(planar formats)是指每Y份量,U份量和V份量都是以獨立的平面組織的, 也就是說所有的U份量必須在Y分量後面,而V份量在所有的U份量後面, 此一格式適用於採樣(subsample)。 平面格式(planar format)有I420(4:2:0)、YV12、IYUV等。 ## YUV格式 為節省頻寬起見,大多數YUV格式平均使用的每像素位數都少於24位元。 - 主要的抽樣(subsample)格式有 YCbCr 4:2:0、 YCbCr 4:2:2、 YCbCr 4:1:1 YCbCr 4:4:4。 YUV的表示法稱為A:B:C表示法: 4:4:4表示完全取樣。 4:2:2表示2:1的水平取樣,垂直完全採樣。 4:2:0表示2:1的水平取樣,垂直2:1採樣。 4:1:1表示4:1的水平取樣,垂直完全採樣。 最常用Y:UV記錄的比重通常1:1或2:1 - DVD-Video是以YUV 4:2:0的方式記錄,也就是我們俗稱的I420, YUV4:2:0並不是說只有U(即Cb), V(即Cr)一定為0, 而是指U:V互相援引,時見時隱,也就是說對於每一個行, 只有U或者V份量,如果一行是4:2:0的話, 下一行就是4:0:2,再下一行是4:2:0...以此類推。 ### YUV444 色度信號分辨率最高的格式是YUV4:4:4,每4點Y採樣,就有相對應的4點U和4點V。 換句話說,每個Y值對應一個U和一個V值。在這種格式中, 色度信號的分辨率和亮度信號的分辨率是相同的。 這種格式主要應用在視頻處理設備內部,避免畫質在處理過程中降低。  YUV444區分方法:如圖所示 4個Y值,第1行獲得4組UV色度值(如像素1、2、3、4均可獨立表示) 第2行也獲得4組UV色度值(如像素5、6、7、8均可獨立表示)。 ### YUV422 色度信號分辨率格式YUV4:2:2,每4點Y採樣,就有相對應的2點U和2點V。 可以看到在水平方向上的色度表示進行了2倍下採樣,因此YUV422色度信號分辨率是亮度信號分辨率的一半。  YUV422區分方法:如圖所示 4個Y值,第1行獲得2組UV色度值(其中像素1、2合併為1組UV值表示,3、4合併為1組) 第2行獲得2組UV色度值(其中像素5、6合併為1組,7、8合併為1組)。 ### YUV420 色度信號分辨率格式YUV4:2:0,每4點Y採樣,就有相對應的1點U和1點V。 YUV420色度信號分辨率是亮度信號分辨率的1/4。  YUV420區分方法:如圖所示 4個Y值,第1行獲得2組UV色度值(其中1、2合併為1組,3、4合併為1組) 第2行獲得0組UV色度值(5-8像素的色度值全丟棄)。 即在水平方向壓縮的基礎上,再在垂直方向上再進行了壓縮。 :::spoiler YUV不同採樣格式對圖像畫質的影響分析 根據前述的YUV採樣格式分析,這裡我們分析一下對圖像畫質的影響。我們將一個原始圖像為8*8像素的紅藍相間的圖案,分別按YUV444、YUV422、YUV420不同的採用格式採樣,然後再還原輸出。 ![Uploading file..._zz229n8oc]() (a):我們可以看到YUV444的色度信號的分辨率和亮度信號的分辨率無損失,我們獲得了與原始圖案一致的還原畫面圖案。 (b):YUV422獲得還原圖案在水平方向上,已經出現了丟失,從綠色所框選的像素來看,YUV422在水平方向上丟失了另一個像素點的色彩值,故在畫面還原時僅是對前一個像素值簡單的複制重構。 (c):YUV420獲得還原圖案在水平方向以及垂直方向上,均出現了丟失,獲得的還原圖像與原始圖像出現很大的失真。 參考網站(http://m.pjtime.com/2021/4/m192828404475.shtml) :::
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up