1. 程式人生 > 其它 >如何儲存浮點型數值的影象? (C++ / OpenCV)

如何儲存浮點型數值的影象? (C++ / OpenCV)

技術標籤:計算機視覺演算法c++

目錄

前言

方式1

結果

方式2

結果


前言

儲存浮點型的影象,比如儲存深度圖,深度值不是整數的情況. 但一般的影象格式(png jpg等)只能儲存整數型別的數值,因為要顯示出來的話,需要與整數型別的顏色表一一對應.這裡給出兩種方式.

方式1

將對應的數值整數化,即乘以一個值,轉成整數,儲存起來,在使用時再除以這個整數(比如256)

#include <opencv2/opencv.hpp>
#include <cstdlib>
#include <ctime>

int main_png(int argc, char **argv)
{
	cv::Mat depthMapPng = cv::Mat::zeros(600, 800, CV_16UC1); // data range: 0~65526
    for (size_t i = 0; i <depthMapPng.rows; ++i)
    {
        for (size_t j = 0; j <depthMapPng.cols; ++j)
        {
            srand(i*j);
            float value = rand()%6000;
            depthMapPng.ptr<int>(i)[j] = value;
        }
    }
    cv::imwrite("test.png",depthMapPng); //uint16

}

結果

方式2

使用tiff格式直接儲存浮點型數值,但用一般的檢視工具開啟顯示時,會很奇怪.

int main(int argc, char **argv)
{
    cv::Mat depthMapPng = cv::Mat::zeros(600, 800, CV_32FC1); 
    for (size_t i = 0; i <depthMapPng.rows; ++i)
    {
        for (size_t j = 0; j <depthMapPng.cols; ++j)
        {
            srand(i*j);
            float value = rand()%6000 + 0.1;
            depthMapPng.ptr<float>(i)[j] = value;
        }
    }
    cv::imwrite("test_float.tiff",depthMapPng);

}

結果

其他參考