Matlab批量读取元胞数组中数据保存到txt文件中(WIDER FACE数据集中,读取人脸标注矩形框信息)

WIDER FACE:http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/

1、文件说明:

"wider_face_split.zip" 文件包含三个子文件:

wider_face_train.mat, wider_face_val.mat, andwider_face_test.mat.

其中,每个子文件中元胞数组:

The 'event_list'包含61个种类的文件夹名

The 'face_bbx_list' 包含每个种类中图片中人脸的标注矩形框

The 'file_list' 包含每个种类中图片名

标注的矩形框的格式如下:

<x_left y_top width height>.

参考地址:http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/support/example/README.txt

 

2、  要求

导出数据为如下格式

格式:event_list\file_list\face_bbx_list


注:

event_list、file_list、face_bbx_list三个元胞数组里面的内容是一一对应的,切记要一一对应。

对应图片:http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/


matlab程序:

<span style="font-size:24px;"><span style="font-size:24px;">%功能描述,读取'wider_face_train.mat'文件中存储的文件夹名、文件图片名及标注矩形框位置(每个图片一行)
clc;clear;
wider_face_val = load('wider_face_val.mat')  %加载'wider_face_val.mat'文件
fid = fopen('val.txt','w');  %以只读方式打开文件'val.txt'
for i = 1:61  %文件夹个数
    num_j = length(wider_face_val.file_list{i,1})  %每个文件夹中图片个数
    for j = 1:num_j  %遍历每个文件夹中图片
        %[num_k, num_un] = size(wider_face_val.face_bbx_list{i,1}{j,1})  %取每个图片中人脸个数,即标注矩形框个数
        fprintf(fid, '%s%s', wider_face_val.event_list{i,1},'\');  %写入文件夹名
        fprintf(fid, '%s%s ', wider_face_val.file_list{i,1}{j,1},'.jpg');  %写入图片名
        fprintf(fid, '%g ', wider_face_val.face_bbx_list{i,1}{j,1});  %写入标注矩形框坐标
        fprintf(fid, '\n');  %换行
    end
end
fclose(fid);  %关闭文件</span></span>

<span style="font-size:24px;"><span style="font-size:24px;">%功能描述,读取'wider_face_train.mat'文件中存储的文件夹名、文件图片名及标注矩形框位置(每个人脸矩形框一行)
clc;clear;
wider_face_train = load('wider_face_train.mat')  %加载'wider_face_train.mat'文件
fid = fopen('train.txt','w');  %以只读方式打开文件'train.txt'
for i = 1:61  %文件夹个数
    num_j = length(wider_face_train.file_list{i,1})  %每个文件夹中图片个数
    for j = 1:num_j  %遍历每个文件夹中图片
        [num_k, num_un] = size(wider_face_train.face_bbx_list{i,1}{j,1})  %取每个图片中人脸个数,即标注矩形框个数
        if num_k == 1
            fprintf(fid, '%s%s', wider_face_train.event_list{i,1},'\');  %写入文件夹名
            fprintf(fid, '%s%s ', wider_face_train.file_list{i,1}{j,1},'.jpg');  %写入图片名
            fprintf(fid, '%g ', wider_face_train.face_bbx_list{i,1}{j,1});  %写入标注矩形框坐标
            fprintf(fid, '\n');  %换行
        else
            for k = 1:num_k  %遍历每个图片中标注框
                %a =  wider_face_train.face_bbx_list{i,1}{j,1}( k, :);
                fprintf(fid, '%s%s', wider_face_train.event_list{i,1},'\');
                fprintf(fid, '%s%s ', wider_face_train.file_list{i,1}{j,1},'.jpg');
                fprintf(fid, '%g ', wider_face_train.face_bbx_list{i,1}{j,1}( k, :));  %写入该图片中第k个标注框位置
                fprintf(fid, '\n');
            end
        end
    end
end
fclose(fid);  %关闭文件</span></span>
<span style="font-size:24px;">%功能描述:读取'wider_face_train.mat'文件中存储的图片名及标注矩形框位置(每个人脸矩形框一行)
%格式形如“name.jpg x y x+w y+h”,且x,y,w,h都为整数  
clc;clear;
wider_face_train = load('wider_face_train.mat');
fid = fopen('11.txt','w');
for i = 1:61
    num_j = length(wider_face_train.file_list{i,1});
    for j = 1:num_j
        [num_k, num_un] = size(wider_face_train.face_bbx_list{i,1}{j,1});
        if num_k == 1
            %fprintf(fid, '%s%s', wider_face_val.event_list{i,1},'\');
            fprintf(fid, '%s%s ', wider_face_train.file_list{i,1}{j,1},'.jpg');
            fprintf(fid, '%g ', int16(wider_face_train.face_bbx_list{i,1}{j,1}( num_k, 1 )));
            fprintf(fid, '%g ', int16(wider_face_train.face_bbx_list{i,1}{j,1}( num_k, 2 )));
            fprintf(fid, '%g ', int16(wider_face_train.face_bbx_list{i,1}{j,1}( num_k, 1 ) + wider_face_train.face_bbx_list{i,1}{j,1}( num_k, 3 )));
            fprintf(fid, '%g', int16(wider_face_train.face_bbx_list{i,1}{j,1}( num_k, 2 ) + wider_face_train.face_bbx_list{i,1}{j,1}( num_k, 4 )));
            fprintf(fid, '\n');
        else
            for k = 1:num_k
                %fprintf(fid, '%s%s', wider_face_val.event_list{i,1},'\');
                fprintf(fid, '%s%s ', wider_face_train.file_list{i,1}{j,1},'.jpg');
                fprintf(fid, '%g ', int16(wider_face_train.face_bbx_list{i,1}{j,1}(  k, 1 )));
                fprintf(fid, '%g ', int16(wider_face_train.face_bbx_list{i,1}{j,1}(  k, 2 )));
                fprintf(fid, '%g ', int16(wider_face_train.face_bbx_list{i,1}{j,1}(  k, 1 ) + wider_face_train.face_bbx_list{i,1}{j,1}(  k, 3 )));
                fprintf(fid, '%g', int16(wider_face_train.face_bbx_list{i,1}{j,1}(  k, 2 ) + wider_face_train.face_bbx_list{i,1}{j,1}(  k, 4 )));
                fprintf(fid, '\n');
            end
        end
    end
end
fclose(fid);</span>

<span style="font-size:24px;">%功能描述:读取'wider_face_train.mat'文件中存储的图片名及标注矩形框位置(每个人脸矩形框一行)
%格式形如“name.jpg x y w h”,且x,y,w,h都为整数
%要求:去掉x,y小于0,且w,h为0的人脸框
clc;clear;
wider_face_train = load('wider_face_val.mat');
fid = fopen('val_chenqi.txt','w');
for i = 1:61
    num_j = length(wider_face_train.file_list{i,1});
    for j = 1:num_j
        [num_k, num_un] = size(wider_face_train.face_bbx_list{i,1}{j,1});
        if num_k == 1
            %fprintf(fid, '%s%s', wider_face_val.event_list{i,1},'\');
            if int16(wider_face_train.face_bbx_list{i,1}{j,1}( num_k, 3 ))==0 | int16(wider_face_train.face_bbx_list{i,1}{j,1}( num_k, 4 ))==0
                continue;
            end
            a1 = int16(wider_face_train.face_bbx_list{i,1}{j,1}( num_k, 1 ));
            if a1 < 0
                a1 = 0;
            end
            b1 = int16(wider_face_train.face_bbx_list{i,1}{j,1}( num_k, 2 ));
            if b1 < 0
                b1 = 0;
            end
            fprintf(fid, '%s%s ', wider_face_train.file_list{i,1}{j,1},'.jpg');
            fprintf(fid, '%g ', a1 );
            fprintf(fid, '%g ', b1 );
            fprintf(fid, '%g ', int16(wider_face_train.face_bbx_list{i,1}{j,1}( num_k, 3 )));
            fprintf(fid, '%g',  int16(wider_face_train.face_bbx_list{i,1}{j,1}( num_k, 4 )));
            fprintf(fid, '\n');
        else
            for k = 1:num_k
                %fprintf(fid, '%s%s', wider_face_val.event_list{i,1},'\');
                if int16(wider_face_train.face_bbx_list{i,1}{j,1}( k, 3 ))==0 | int16(wider_face_train.face_bbx_list{i,1}{j,1}( k, 4 ))==0
                    continue;
                end
                a2 = int16(wider_face_train.face_bbx_list{i,1}{j,1}( k, 1 ));
                if a2 < 0
                    a2 = 0;
                end
                b2 = int16(wider_face_train.face_bbx_list{i,1}{j,1}( k, 2 ));
                if b2 < 0
                    b2 = 0;
                end
                    fprintf(fid, '%s%s ', wider_face_train.file_list{i,1}{j,1},'.jpg');
                    fprintf(fid, '%g ', a2 );
                    fprintf(fid, '%g ', b2 );
                    fprintf(fid, '%g ', int16(wider_face_train.face_bbx_list{i,1}{j,1}(  k, 3 )));
                    fprintf(fid, '%g',  int16(wider_face_train.face_bbx_list{i,1}{j,1}(  k, 4 )));
                    fprintf(fid, '\n');
            end
        end
    end
end
fclose(fid);</span>



### MATLAB 中将数组写入 XLS 文件的方法 为了实现这一目标,`writecell` 函数是一个非常有效的工具。此函数允许直接把数组的内容写入 Excel 文件中,并支持指定特定的工作表以及数据放置的具体位置。 #### 使用 `writecell` 函数的基本语法 ```matlab % 基础用法:仅需提供文件名和要写的数组即可 writecell(C, 'filename.xls'); ``` 如果希望更精确地控制数据的位置,则可以通过增加参数来指明具体的目标工作表及其范围: ```matlab % 高级用法:指定工作表名称及起始单格地址 writecell(C, 'filename.xls', 'SheetName', sheetname, 'Range', range); ``` 这里需要注意的是,在某些情况下可能遇到由于数据类型不匹配而导致的操作失败。为了避免这种情况发生,建议提前确认待写入的数据已经是以数组的形式存在;如果不是的话,则应该先完成相应的转换过程[^3]。 下面给出一段完整的代码示例用于说明如何执行上述操作: ```matlab % 创建一个简单的例子数组 exampleCellArray = {1, 2; 'text', datestr(now);}; % 定义输出路径与文件名 outputFilePath = 'test_output.xls'; try % 尝试调用 writecell 函数保存至 .xls 文件 writecell(exampleCellArray, outputFilePath); catch ME disp(['Error occurred: ',ME.message]); end ``` 这段程序创建了一个包含不同类型素(数值、字符串、日期时间)的小型数组作为示范对象,并尝试将其内容通过 `writecell` 方法存储到名为 "test_output.xls" 的文件里去。同时加入了异常处理机制以便于调试过程中能够及时发现潜在错误信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值