如何儲存浮點型數值的影象? (C++ / OpenCV)
阿新 • • 發佈:2021-02-03
目錄
前言
儲存浮點型的影象,比如儲存深度圖,深度值不是整數的情況. 但一般的影象格式(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); }