MVE(Multi-View Environment),是一款開源的基于圖像的三維重建軟件。在三維重建中有一個(gè)非常重要的步驟就是深度圖(DepthMap)的求解。MVE在重建的過程中會(huì)把它求得的深度圖存放在一個(gè)文件中,但是采用二進(jìn)制存儲(chǔ),我們無法直觀的觀察圖片的深度信息。正好最近需要用到這個(gè)文件,所以根據(jù)MVE的文件存儲(chǔ)說明研究了下它的存儲(chǔ)格式,記錄下來。
在MVE中,深度信息是存放在一個(gè)名為depth-L*.mvei,*的值會(huì)根據(jù)所撰參數(shù)的不同而不同,一般來說是圖片縮小的倍數(shù)。該文件的存儲(chǔ)格式說明很簡(jiǎn)單:
根據(jù)這個(gè)說明,可以看出整個(gè)文件從前往后由3部分構(gòu)成:
1、頭部信息
共11個(gè)字節(jié)。第一個(gè)字節(jié)是/x89,用于和其他文件去分開來;接下來的9個(gè)字節(jié)就是MVE_IMAGE這幾個(gè)字符ASCII值;最后一個(gè)字節(jié)是換行符。
2、圖像信息
這部分包含了圖像的寬度、高度、通道、圖像類型,這些信息都是由一個(gè)4字節(jié)的有符號(hào)整形表示。寬度和高度,有了長(zhǎng)寬就知道一共有多少個(gè)像素,就知道一共有多少個(gè)深度信息;通道部分,由于深度信息只有一個(gè)通道,所以解析出來的值是1;圖像類型是在mve::ImageType這個(gè)枚舉類型中的一種,查看源碼發(fā)現(xiàn)長(zhǎng)這樣:
enum ImageType
{
IMAGE_TYPE_UNKNOWN,
/* Unsigned integer types. */
IMAGE_TYPE_UINT8, // uint8_t, unsigned char
IMAGE_TYPE_UINT16, // uint16_t
IMAGE_TYPE_UINT32, // uint32_t, unsigned int
IMAGE_TYPE_UINT64, // uint64_t
/* Signed integer types. */
IMAGE_TYPE_SINT8, // int8_t, char, signed char
IMAGE_TYPE_SINT16, // int16_t
IMAGE_TYPE_SINT32, // int32_t, int
IMAGE_TYPE_SINT64, // int64_t
/* Floating point types. */
IMAGE_TYPE_FLOAT, // float
IMAGE_TYPE_DOUBLE // double
};
一臉懵逼,說好的整型數(shù)據(jù)呢,,,然而二進(jìn)制解析出來卻是9。一般來說深度信息是浮點(diǎn)數(shù)據(jù),也就是上面的第9個(gè)(程序員請(qǐng)自動(dòng)從0開始數(shù)),剛好對(duì)應(yīng)上,應(yīng)該就是這樣設(shè)定的。
3、深度信息
由圖像信息部分得知了深度信息是采用float型的數(shù)據(jù)存放,也就是每個(gè)數(shù)據(jù)占用4字節(jié),那么只需要每次讀入4字節(jié)的數(shù)據(jù),轉(zhuǎn)化成為float型數(shù)據(jù)就可以得到了一個(gè)像素的深度信息,放入數(shù)組后就可以得到一個(gè)所有像素的深度信息一維數(shù)組。然后根據(jù)圖像的長(zhǎng)寬信息把所有數(shù)據(jù)轉(zhuǎn)化成為二維數(shù)組就可以用了。