尝试
verilog仿真的数据如下(部分):每个数都是16进制的,一个数24bit代表rgb888.
用matlab把txt读为矩阵数据:
im_list = importdata('fpga_gen_picture.txt',',',375);
读到的是cell类型的数据,即375个字符串,绝了。尝试了很多种博客的方法都不行,关键还是数组里有字符,字符里还需要分割,那就只能自己写一个脚本了。
另外str2num只能把十进制的字符转为数字,若含十六进制的字符abcdef就不行了!hex2dec可以把字符型的十六进制转化为十进制的数!
给出这一代的代码,这个代码并不能正常使用!(下面有解释这个bug)
im_list = importdata('fpga_gen_picture.txt',',',375);%得到的是h个数组,每个数组内容为一串字符串
% row = strsplit(im_list{300},' ');
% a=row{250}(1:2);
% aa=hex2dec(a);
for i = 1: h
row = strsplit(im_list{i},' ');%读一行的数据,并分割为w个字符
for j = 1: w
temp1=row{j}(1:2);
R(i:j) = hex2dec(temp1);
temp2=row{j}(3:4);
G(i:j) = hex2dec(temp2);
temp3=row{j}(5:6);
B(i:j) = hex2dec(temp3);
fprintf('i:%d j: %d . G= %d,temp3:%s \n',i,j,G(i:j),temp3);
end
end
RGB(:,:,1)=R;
RGB(:,:,2)=G;
RGB(:,:,3)=B;
imshow(RGB,[]);
matlab 的一个bug
继续尝试
算了,我何必要在matlab里转换进制,在verilog仿真的时候输出为十进制不就好了?(最开始24bit直接输出十进制肯定不行,但是现在分开为rgb三个文件,里面每个数据都是8bit时,可以直接输出为十进制!!)
文本数据如下:
matlab进行数据处理也没有python方便,矫情,还不如verilog对每个位进行处理方便。
matlab代码如下:(有关txt文本数据见上一篇博客)
clear all;
h=375;
w=500;
RGB=uint8(zeros(h, w, 3));
R = uint8(zeros(h, w));
G = uint8(zeros(h, w));
B = uint8(zeros(h, w));
r_cell = importdata('fpga_gen_picture_r.txt',',',h);
g_cell = importdata('fpga_gen_picture_g.txt',',',h);
b_cell = importdata('fpga_gen_picture_b.txt',',',h);
for i =1 :h
R(i,:)=str2num( r_cell{i});%只能用{}的方式取到字符串,再进行操作
G(i,:)=str2num( g_cell{i});
B(i,:)=str2num( b_cell{i});
end
RGB(:,:,1)=R;
RGB(:,:,2)=G;
RGB(:,:,3)=B;
imshow(RGB,[]);
虽然结果不咋地,但好歹还是把整个流程跑通了。下图是matlab显示的图像数据,是verilog在图像处理时出了问题。
错误小结:
1.在verilog仿真时犯了错。在仿真的时候,满足条件时只写入了回车没有写入数据到txt,导致数据少了375个。哎。
2.imshow显示的图像如果是黑色的,那就是图像数据的问题,不是矩阵合并的问题。
一些尝试过的函数
%R_list = char(zeros(h, w));
for i = 1: h
row = strsplit(im_list{i},' ');%读一行的数据,并分割为w个字符
for j = 1: w
% R(i:j) = str2double( temp{j}(1:2) );
% temp2(j) = str2num(temp{j})%把第i行第j列的字符转化为数字,其中不能含abcdef的十六进制数!
% R_list(i:j:1)=row{i}(1:2) ;%1个字符 = 2个字符是不能赋值的
% R_list(i:j:1)=strcat(row{i}(1),row{i}(2)) ;%1个字符 = 2个字符是不能赋值的
end
end
str2num
能把字符(除abcdef外)转化为数字/数组,字符比如:
'1'
'11 12 13'
结果:
1
11 12 13
hex2dec
能把字符(含abcdef)转化为十进制的数字/数组,字符比如:
'ff'
'ff fe fd'
结果:
255
255 254 253
abs
b=abs('a' );%字符a按ascii转换
结果:
b=97
strsplit
将字符串按’ ,'分割开来:
temp = strsplit(str,',');
查看变量属性
a='ff'
whos a
class(a)
关于cell
cell类型的数据处理。
matlab使用importdata函数从txt得到的是很多个cell数据。
txt文本数据(部分):
cell(1)得到的还是cell
cell{1}得到的是字符串(即txt的第一行所有的数据)
cell{1}(1:2)得到字符’d6’
cell2mat则将所有的txt数据转为字符矩阵(每8bit一个字符)