您的位置:首页 > 编程语言 > MATLAB

如何将opencv的处理结果保存由matlab分析

2013-11-13 19:39 281 查看
由于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);

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: