創建以YUVtoJPEG為名稱的M檔案,讀取CIF格式的YUV檔案mobile_cif_300f.yuv的前30幀,并逐一以jpg格式保存各視頻幀至當前目錄下,視頻幀幀號命名相對應的jpg圖片,并生成第2幀至第30幀的在Y通道上與前一幀的殘差影像,以BMP格式、以視頻幀幀號命名,保存至當前目錄下!
function [Y,U,V] = ReadMultiFrames(yuvfilename,format,init2last)
%該函式用于將yuv格式的視頻連續多幀分別讀入到三維陣列Y,U,V之中
%yuv視頻的采樣格式為4:2:0
%輸入引數:
% yuvfilename ---- 視頻yuv檔案路徑名
% format ---- 視頻格式(格式名or解析度[rows,cols])
% init2last ---- 讀取的視頻幀的范圍[初始幀序號,終止幀序號]
%輸出引數:
% Y ---- 亮度,三維陣列,第三維為幀序號,前兩維是單幀的行和列
% U,V ---- 色差,三維陣列,第三維為幀序號,前兩維是單幀的行和列
%呼叫示范:
% [Y,U,V] = ReadMultiFrames('.\videoname.yuv','cif',[100,101]);
% [Y,U,V] = ReadMultiFrames('.\videoname.yuv',[288,352],[100,101]);
close all;
if ischar(format)
format = lower(format);
switch format
case 'sub_qcif'
cols = 128; rows = 96;
case 'qcif'
cols = 176; rows = 144;
case 'cif'
cols = 352; rows = 288;
case 'sif'
cols = 352; rows = 240;
case '4cif'
cols = 704; rows = 576;
otherwise
error('no format!');
end
elseif isequal(size(format),[1,2])||isequal(size(format),[2,1])
cols = format(2);rows = format(1);
else
error('第二引數輸入有誤!');
end
point = fopen(yuvfilename,'r');
if point == -1
error('打開檔案失敗!');
end
order_num = init2last(1);
frames_num = init2last(2) - order_num + 1;
k = 0;
Y = zeros(rows,cols,frames_num);
U = zeros(rows/2,cols/2,frames_num);
V = U;
offset = order_num*(rows*cols + rows*cols/2);
status = fseek(point,offset,'bof');
pro = fread(point,1,'uchar');
if (isempty(pro)&&feof(point)) || status ~=0
error('讀取位置定位失敗!');
end
fseek(point,-1,'cof');
for ii = 1:frames_num
k = k + 1;
pro = fread(point,1,'uchar');
if feof(point)&&isempty(pro)
disp('讀取幀數范圍已超過yuv視頻總幀數!');
Y = Y(:,:,1:k-1);
U = U(:,:,1:k-1);
V = V(:,:,1:k-1);
break;
end
fseek(point,-1,'cof');
temp = fread(point,[cols,rows],'uchar');
Y(:,:,ii) = temp';
temp = fread(point,[cols/2,rows/2],'uchar');
U(:,:,ii) = temp';
temp = fread(point,[cols/2,rows/2],'uchar');
V(:,:,ii) = temp';
end
fclose(point);
end
for i=1:30
[Y,U,V]=ReadMultiFrames('.\mobile_cif_300f.yuv','cif',[1,30]);
U=imresize(U,2);
V=imresize(V,2);
B=2.032*U+Y;
R=1.140*V+Y;
G=Y-0.394*U-0.581*V;
B=mat2gray(B);
R=mat2gray(R);
G=mat2gray(G);
f=cat(3,R,G,B);
%imshow(f);
imwrite(f,[num2str(i), '.jpg'],'.jpg');
end
uj5u.com熱心網友回復:
for i=0:29[Y,U,V]=ReadMultiFrames('.\mobile_cif_300f.yuv','cif',[i,i]);
U=imresize(U,2);
V=imresize(V,2);
B=2.032*U+Y;
R=1.140*V+Y;
G=Y-0.394*U-0.581*V;
B=mat2gray(B);
R=mat2gray(R);
G=mat2gray(G);
f=cat(3,R,G,B);
imwrite(f,strcat(num2str(i+1), '.jpg'),'jpg');
end
str='H:\MATLAB\05\';
for i=1:30
img2=imread([str,num2str(i),'.jpg']);
end
R=f(:,:,1);
G=f(:,:,2);
B=f(:,:,3);
Y = 0.299*R + 0.587*G + 0.114*B;
for i=1:29
img3=Y(i+1)-Y(i);
img3=mat2gray(img3);
imwrite(img3,strcat(num2str(i+1),'.bmp'),'bmp');
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/60225.html
