OriginBot
OriginCar
智能车竞赛
ROS探索总结
ROS2探索总结
ROS入门教程
ROS
建图导航
运动控制
自动驾驶
机器视觉
机器学习
建模仿真
机器人学
ROS2入门教程
硬件电路
创客DIY教程
智能机器人创意大赛
ROS史话36篇
学习笔记
ROS2
技术前沿
行业资讯
古月居社区公告
RDK开发套件
机械臂控制
嵌入式开发
Linux
本次学习的内容主要是
modelsim波形中数据导出到txt文档
,以及
matlab的文本文件与图像间的转化
方法。
—————————————————————————————————
因为在使用
FPGA
进行图像处理的时候需要进行图像显示,在
手边没有显示屏的情况下
,可以将modelsim仿真wave中的数据变量导出到txt文档,然后将txt文档导入到matlab中进行图片的显示。
准备一个图片(注意格式和图片大小)
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文件
%==========================================================================
% 彩色图片转为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('处理前的图片'); %查看处理前的图片
读入图像并进行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);
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,[]); %显示图片
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文件读入,并进行显示即可。
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仿真测试