错误使用重塑的元素数量不能改变。使用[]的输入自动计算合适的大小尺寸。

37视图(30天)
我想视频编码比特然后添加错误的概率解码一遍但是当我解码时出现这个错误扭转数据包的一步
这是完整的代码
clc
关闭所有
清晰的所有
obj = VideoReader (“Stephan.avi”);
错误使用VideoReader / initReader
指定的文件名不存在在MATLAB路径。

错误audiovideo.internal.IVideoReader(第136行)
initReader (obj,文件名,currentTime);

错误VideoReader(第104行)
obj@audiovideo.internal.IVideoReader(变长度输入宗量{:});
=阅读(obj);
帧=得到(obj,“NumberOfFrames”);
我= 1:框架
我(我).cdata =(::,:,我);
结束
s =大小(I (1) .cdata);
mov(1:帧)=结构(cdata的,0 (1),(2),3,“uint8”),“colormap”[]);
帧= 1:296
%红色框架的组件
R =我(帧).cdata (:,: 1);
%绿色框架的组件
G =我(帧).cdata (:,:, 2);
%蓝色框架的组件
B =我(帧).cdata (:,:, 3);
结束
Rdouble =双(R);
Gdouble =双(G);
Bdouble =双(B);
Rbin = de2bi (Rdouble);
Gbin = de2bi (Gdouble);
Bbin = de2bi (Bdouble);
Rr =重塑(Rbin 1刺激(大小(Rbin)));%我们重塑把红色作为流1行
Gr =重塑(Gbin 1刺激(大小(Gbin)));%我们重塑把绿色作为流1行
Br =重塑(Bbin 1刺激(大小(Bbin)));%我们重塑把蓝色的流1行
pcksize = 1024;
noofpckts = 101376 * 8 / pcksize;
Rpck =重塑(Rbin [noofpckts pcksize]);
Gpck =重塑(Gbin [noofpckts pcksize]);
Bpck =重塑(Bbin [noofpckts pcksize]);
%格子= poly2trellis (ConstraintLength CodeGenerator)
格子= poly2trellis (7, (135 135 147 163));
我= 1:noofpckts
Rcoded = convenc (Rpck(我:),格子);
Gcoded = convenc (Gpck(我:),格子);
Bcoded = convenc (Bpck(我:),格子);
一个= 0.0001;
b = 0.2;
p =兰特(1,1)* (b) +;
Rerror =二元同步通信(Rcoded p);
Gerror =二元同步通信(Gcoded p);
Berror =二元同步通信(Bcoded p);
tbdepth = 34;
tbdepth Rdecoded = vitdec (Rerror,格子,“trunc”,“硬”);
tbdepth Gdecoded = vitdec (Gerror,格子,“trunc”,“硬”);
tbdepth Bdecoded = vitdec (Berror,格子,“trunc”,“硬”);
Rnpck =重塑(Rdecoded [pcksize noofpckts]);
Gnpck =重塑(Gdecoded [pcksize noofpckts]);
Bnpck =重塑(Bdecoded [pcksize noofpckts]);
Rr =重塑(Rnpck 8 prod(大小(Rnpck)));
Gr =重塑(Gnpck 8 prod(大小(Gnpck)));
Br =重塑(Bnpck 8 prod(大小(Bnpck)))
Rn = bin2dec (Rr);
Gn = bin2dec (Gr);
Bn = bin2dec (Br);
Rd.ToDouble ();
Gd.ToDouble ();
Bd.ToDouble ();
结束
i = 1:296
mov (i) .cdata (:,: 1) = Rd;
mov (i) .cdata (:,: 2) = Gd;
mov (i) .cdata(:,:, 3) =双相障碍;
结束
%写作的视频
视频= VideoWriter (“channnelzft.avi”,未压缩的AVI的);
开放(视频);
writeVideo(视频、mov);
关闭(视频);

答案(2)

沃尔特·罗伯森
沃尔特·罗伯森 2023年5月23日20:11
Rbin = de2bi (Rdouble);
相当于
Rbin = de2bi (Rdouble (:));
输出的大小将元素个数(Rdouble) max(装天花板(log2 (Rdouble + 1),[], '所有'),右边的表达式是最低所需的比特数来表示二进制最大的价值。这将不 一定 是8位/条目,根据价值——例如如果红色组件的形象都是0,那么只有1列Rbin所需的比特会
Rr =重塑(Rbin 1刺激(大小(Rbin)))
你可以更容易的代码 Rr =重塑(Rbin 1 []);
pcksize = 1024;
noofpckts = 101376 * 8 / pcksize;
Rpck =重塑(Rbin [noofpckts pcksize]);
假设一个固定的数组大小的视频,并假设R, G, B都充分利用8位/组件。
1评论
沃尔特·罗伯森
沃尔特·罗伯森 2023年5月24日20:00
Rdouble = [0 1 63]
Rdouble = 1×3
0 1 63
Gdouble = (83 91 126)
Gdouble = 1×3
83 91 126
Bdouble = [0 240 240]
Bdouble = 1×3
0 240 240
de2bi (Rdouble)
ans = 3×6
0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1
de2bi (Gdouble)
ans = 3×7
1 1 0 0 1 0 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1
de2bi (Bdouble)
ans = 3×8
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
注意这些有不同数量的列根据所代表的最大价值。
你现有的代码不仅假定产生一致的列数是:它还假设图像总是 完全 相同数量的元素,例如如果它总是288 * 352。
你需要重写代码,以确保de2bi()总是返回相同数量的列,和你需要重写代码占不同的数组大小,包括占一个完整的图像可能不会包含一个整数的数据包数量。

登录置评。


克里斯·拉皮埃尔
克里斯·拉皮埃尔 2023年5月23日20:12
问题似乎是,你没有像你想象的数组中元素的个数。
代码写预计有1024 x792元素。R, G和B只有最后一帧的cdata。
一个= 1:6;
%使用[]autosize结果
B =重塑(2 [])
B = 2×3
1 3 5 2 4 6
%你的错误
C =重塑(2,2)
错误使用重塑
的元素数量不能改变。使用[]的输入自动计算合适的大小尺寸。
4评论
克里斯·拉皮埃尔
克里斯·拉皮埃尔 2023年5月23日23:53
代码共享还只是捕捉最后一帧。
帧= 1:5
R =框架;
结束
R
R = 5
这段代码%比较
帧= 1:5
R2 =帧(帧);
结束
R2
R2 = 1×5
1 2 3 4 5

登录置评。

类别

找到更多的在错误检测和校正帮助中心文件交换

标签

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!