添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
OriginBot OriginCar 智能车竞赛 ROS探索总结 ROS2探索总结 ROS入门教程 ROS 建图导航 运动控制 自动驾驶 机器视觉 机器学习 建模仿真 机器人学 ROS2入门教程 硬件电路 创客DIY教程 智能机器人创意大赛 ROS史话36篇 学习笔记 ROS2 技术前沿 行业资讯 古月居社区公告 RDK开发套件 机械臂控制 嵌入式开发 Linux

本次学习的内容主要是 modelsim波形中数据导出到txt文档 ,以及 matlab的文本文件与图像间的转化 方法。
—————————————————————————————————
因为在使用 FPGA 进行图像处理的时候需要进行图像显示,在 手边没有显示屏的情况下 ,可以将modelsim仿真wave中的数据变量导出到txt文档,然后将txt文档导入到matlab中进行图片的显示。

1、用Matlab实现图像格式转换

1.1 matlab将灰度图片转换成txt文档

  • 准备一个图片(注意格式和图片大小)
  • a=imread('2.bmp');   %读入图片
    b=rgb2gray(a);        %由rgb图片转化为灰度图        
    c=b';       %matlab图片转换为矩阵是一列一列转的,最终图像是行为单位,转置                 
    fid0=fopen('data.txt','wt'); % 创建并打开一个名为data.txt的文件,可写
    fprintf(fid0,'%x\n',c);      %把灰度图矩阵b以16进制写入data.txt文件,没写入一个元素换一行    
    fclose(fid0);          %关闭保存该data.txt文件             
    

    1.2 matlab将彩色图片转换成txt文档

    %==========================================================================
    %                 彩色图片转为txt文本,格式为24bit的hex数据
    %==========================================================================
    clear all;
    %--------------------------------------------------------------------------
    pre_img = imread('pre_img.jpg');   %读取图片文件
    [ROW,COL,N] = size(pre_img);       %获得图片尺寸[高度,宽度,维度]
    RGB_ij = uint64(zeros(ROW,COL));   %定义32位宽的RGB变量
    %--------------------------------------------------------------------------
    fid = fopen('pre_img.txt','w');    %打开txt文档
    for i = 1:ROW
        for j = 1:COL
            R = double(pre_img(i,j,1));
            G = double(pre_img(i,j,2));
            B = double(pre_img(i,j,3));
            %-------------------------------------
            RGB          = R*(2^16) + G*(2^8) + B;
            RGB_ij(i,j)  = RGB;
            RGB_hex      = dec2hex(RGB);
            %-------------------------------------
            fprintf(fid,'%s\n',RGB_hex); %将字符打印到txt文档中
    fclose(fid);
    %--------------------------------------------------------------------------
    imshow(pre_img),title('处理前的图片');      %查看处理前的图片
    

    1.3 matlab将图片转换成hex文件

    读入图像并进行hex文件转换,注意图像尺寸要相同。

    b=imread('100.bmp'); % 24-bit BMP image RGB888 
    for i=100:-1:1 % 图像尺寸
    for j=1:100
    a(k)=b(i,j,1);
    a(k+1)=b(i,j,2);
    a(k+2)=b(i,j,3);
    k=k+3;
    fid = fopen('kodim100.hex', 'wt');
    fprintf(fid, '%x\n', a);
    disp('Text file write done');disp(' ');
    fclose(fid);
    

    2、txt文档通过matlab进行图片显示

    fid0=fopen('data.txt','r');    %读入所需要的txt文件
    [a,count]=fscanf(fid0,'%x');  %a为data.txt文件数据读入的矩阵,以16进制形式,count为该矩阵元素个数
    b=reshape(a,100,100);       % 构建成100*100的矩阵形式     
    c=b';           %   需要再转置一次方为图片行列方向的矩阵             
    imshow(c,[]);    %显示图片    
    

    3、modelsim仿真wave中数据变量导出到txt文档

    https://blog.csdn.net/weiweiliulu/article/details/51443286

    verilog程序中添加相对应的代码即可(在tb测试文件中添加)

    //如下想要将120*120图像大小的14400个数据导出
    always @ (posedge clk)
    begin
    	if (!rst_n)
    		i <=0;
    	else if (i<2501)   
    		i <= i+1;
    		i<= 2501;
    integer w_file;
        initial w_file = $fopen("data_out_1.txt");
        always @(i)
        begin
            $fdisplay(w_file,"%d",rom_data);   //十进制的输出
            if(i == 15'd2500) ;   //共写入2500个数据
    rom_data 是存储在ROM中的数据。
    若操作后发现txt 一直没有数据,检查代码也没错,可尝试把modelsim仿真软件关闭后,数据能存入到 txt 文件里。
    

    - 如何用上面的方法来对 FPGA实现图像裁剪后的图像进行显示

    首先FPGA实现图像裁剪,裁剪最重要的就是 通过给定的边界信息来确定区域,然后将在这个区域内的图像输出。

    原始的图像是120_120,裁剪成 50 _ 50的图片,并显示出来。

    计算好要输出的数据,后在tb文件中加入上面所描述的代码,即可将modelsim波形中要我们所需要的数据导出到 txt 文档中。

    通过matlab将txt文件读入,并进行显示即可。

    4.1 纠错

    fid0=fopen('data.txt','r');    %读入所需要的txt文件
    [a,count]=fscanf(fid0,'%x');  %a为data.txt文件数据读入的矩阵,以16进制形式,count为该矩阵元素个数
    b=reshape(a,100,100);       % 构建成100*100的矩阵形式     
    c=b';           %   需要再转置一次方为图片行列方向的矩阵             
    imshow(c,[]);    %显示图片   
    


    出现此错误的原因是:数据量与显示的图像大小不对应。因为此时txt文件中有2500的数据,那么就是50_50的图像大小,因此进行修改:可成功运行

    b=reshape(a,50,50); 
    fid=fopen('2.mif','W' );           % 打开2.mif文件向里面写数据,如果还没有建立这个文件,会自动建立之后打开
    fprintf(fid,'WIDTH=8;\n');          % 数据宽度为8位(灰度值是0-255,8位的数据)
    fprintf(fid,'DEPTH=65536;\n\n');     % 数据的深度(256*256的图片,65536个数据)
    fprintf(fid,'ADDRESS_RADIX=UNS;\n');% 地址数据为无符号数(unsigned)
    fprintf(fid,'DATA_RADIX=UNS;\n\n'); % 像素数据也是无符号数
    fprintf(fid,'CONTENT BEGIN\n');     
    for x = 1:65536                      % 65536个数据
        fprintf(fid,'%d:%d;\n',x-1,image_1(x)); % 写入数据
    fprintf(fid,'END;');                % 文件结束    
    fclose(fid);                        % 关闭文件
    

    参考:https://blog.csdn.net/DengFengLai123/article/details/106538254

    MATLAB图像处理经验分享fpga开发Modelsim仿真测试