2013-12-19 33 views
2

我已經開始編輯RaspiStillYUV.c代碼。我最終想要處理我收到的圖像,但現在,我只是在努力理解它。爲什麼我使用YUV而不是RGB?所以我可以學到新的東西。我對功能camera_buffer_callback做了一些小修改。所有我做的是以下幾點:在代碼中設置YUV緩衝區結尾的額外字節 - RaspberryPi

現在,尺寸應2592 x 1944(寬x高):這是更換

fprintf(stderr, "GREAT SUCCESS! %d\n", buffer->length); 

線。關閉維基百科(YUV420)我得出結論,文件大小應該是w * h * 1.5。由於Y分量對於每個像素具有1個字節的數據,並且U和V分量對於每4個像素具有1個字節的數據(1 + 1/4 + 1/4 = 1.5)。大。做數學在Python:

>>> 2592 * 1944 * 1.5 
7558272.0 

不幸的是,這不符合我的程序的輸出排隊:

GREAT SUCCESS! 7589376 

剩下的31104字節的差異。

我認爲緩衝區是以固定大小的塊(輸出大小可以被512整除)分配的。雖然我想了解這個謎,但我對固定大小的塊解釋很好。

我的問題是如果我失去了一些東西。在這種格式下超出預期大小的額外字節是否有意義?他們應該被忽略嗎?我的計算關閉了嗎?

+2

這是相當普遍的yuv緩衝區有未使用的尾隨字節,但我不知道樹莓特定的細節。 –

+0

對於其他人看到這一點。我已經切換到SimpleCV和Python。我的(不是太重)改進的RaspiStillYUV代碼在8秒內完成了大約10張圖片。 SimpleCV正在做〜7每秒。兩個樣本都是在沒有額外處理的情況下進行的您可以使用uv4l驅動程序將相機作爲視頻設備使用,以便與SimpleCV一起使用。 – douggard

回答

2

在這個位置的文檔支持您的填充理論:http://www.raspberrypi.org/wp-content/uploads/2013/07/RaspiCam-Documentation.pdf

具體做法是:

注意保存在raspistillyuv圖像緩衝區由16填充到一個 水平尺寸整除(所以有可能是每行末尾 處未使用的字節,以使寬度可被16整除)。緩衝器也是垂直填充的 可以被16整除,而在YUV模式下,Y,U,V的每個平面都以這種方式填充。

所以我對此的解釋如下。 寬度是2592(可以被16整除,所以這是可以的)。 高度是1944年,可以被16除盡,因此額外的8 * 2592被添加(也乘以1.5),因此給你31104額外的字節。

雖然這種方式有助於文件的大小,但它並沒有正確解釋YUV輸出的結構。我有一個看看這個說明,看是否與此提供一個提示開始:http://en.wikipedia.org/wiki/YUV#Y.27UV420p_.28and_Y.27V12_or_YV12.29_to_RGB888_conversion

由此我相信這是如下:

Y通道:

2592 *(1944 8)= 5059584

U通道:

1296 *(972 + 4 )= 1264896

V Channel特別:

1296 *(972 + 4)= 1264896

給予的總和:

5059584 + 2 * 1264896 = 7589376

這使得數字加起來,所以唯一剩下的就是確認這個解釋是否正確。

我也試圖做YUV解碼(用於圖像比較),所以如果您可以確認這是否確實對應於您在YUV文件中讀取的內容,這將非常感謝。

+0

今晚我會檢查它,當我啓動我的pi和後續與確認。這是有道理的。非常感謝! – douggard

0

您必須仔細閱讀本手冊。緩衝區填充到16的倍數,但顏色數據是半角大小,因此您的圖像大小需要爲32的倍數,以避免填充打破外部軟件的問題。