由於OpenCV本身只支持 xml、yml 的數據文件讀寫功能,並且其xml文件與構建網頁數據所用的xml文件格式不一致,在Matlab中無法讀取。我們可以通過以下方式將視差數據保存爲txt文件,再導入到Matlab中。
void saveDisp(const char* filename, const Mat& mat)
{
FILE* fp = fopen(filename, "wt");
fprintf(fp, "%02d/n", mat.rows);
fprintf(fp, "%02d/n", mat.cols);
for(int y = 0; y < mat.rows; y++)
{
for(int x = 0; x < mat.cols; x++)
{
short disp = mat.at<short>(y, x); // 這裏視差矩陣是CV_16S 格式的,故用 short 類型讀取
fprintf(fp, "%d/n", disp); // 若視差矩陣是 CV_32F 格式,則用 float 類型讀取
}
}
fclose(fp);
}
相應的Matlab代碼爲:
function img = txt2img(filename)
data = importdata(filename);
r = data(1); % 行數
c = data(2); % 列數
disp = data(3:end); % 視差
vmin = min(disp);
vmax = max(disp);
disp = reshape(disp, [c,r])'; % 將列向量形式的 disp 重構爲 矩陣形式
% OpenCV 是行掃描存儲圖像,Matlab 是列掃描存儲圖像
% 故對 disp 的重新排列是首先變成 c 行 r 列的矩陣,然後再轉置回 r 行 c 列
img = uint8( 255 * ( disp - vmin ) / ( vmax - vmin ) );
mesh(disp);
set(gca,'YDir','reverse'); % 通過 mesh 方式繪圖時,需倒置 Y 軸方向
axis tight; % 使座標軸顯示範圍與數據範圍相貼合,去除空白顯示區
另外一個版本:
C++本身只支持 xml、yml 的數據文件讀寫功能,並且其xml文件與構建網頁數據所用的xml文件格式不一致,在Matlab中無法讀取。我們可以通過以下方式將數據保存爲txt文件,再導入到Matlab中。
1.C++保存Mat矩陣
Mat_<float> sal = saliency.saliency( im ); ofstream fout; fout.open("sal_value.txt"); fout<<sal.rows<<endl; fout<<sal.cols<<endl; for(int i=0;i<sal.rows;i++){ for(int j=0;j<sal.cols;j++){ fout<<sal.at<float>(i,j)<<endl; } } fout << flush; fout.close();
2.Matlab讀取顯示
data = importdata('sal_value.txt'); r = data(1); % 行數 c = data(2); % 列數 disp = data(3:end); % 視差 vmin = min(disp); vmax = max(disp); disp = reshape(disp, [c,r])'; % 將列向量形式的 disp 重構爲 矩陣形式 % C++/OpenCV是行掃描存儲圖像,Matlab 是列掃描存儲圖像 % 故對 disp 的重新排列是首先變成 c 行 r 列的矩陣,然後再轉置回 r 行 c 列 img = uint8( 255 * ( disp - vmin ) / ( vmax - vmin ) ); imshow(img);