2014-07-21 4 views
1

유체에서 입자를 모방 한 동영상을 생성하는 함수를 작성했습니다. 이 영화는 착색되어 있으며 처음에는 회색 음영의 영화를 만들고 싶습니다. 지금 저는 비디오 라이너 대신 avifile을 사용하고 있습니다. 그레이 스케일 동영상을 얻으려면이 코드를 변경하는 데 도움이 필요합니까? 미리 감사드립니다.Videowriter/avifile을 사용하여 그레이 스케일 비디오 작성

close all; 
clear variables; 
colormap('gray'); 

vidObj=avifile('movie.avi'); 
for i=1:N  
[nx,ny]=coordinates(Lx,Ly,Nx,Ny,[x(i),-y(i)]); 
[xf,yf]=ndgrid(nx,ny); 
zf=zeros(size(xf))+z(i);  

% generate a frame here 
[E,H]=nfmie(an,bn,xf,yf,zf,rad,ns,nm,lambda,tf_flag,cc_flag); 
Ecc=sqrt(real(E(:,:,1)).^2+real(E(:,:,2)).^2+real(E(:,:,3)).^2+imag(E(:,:,1)).^2+imag(E(:,:,2)).^2+imag(E(:,:,3)).^2); 
clf 
imagesc(nx/rad,ny/rad,Ecc); 
writetif(Ecc,i); 
    if i==1 
    cl=caxis; 
    else 
    caxis(cl) 
    end 
axis image; 
axis off; 
frame=getframe(gca); 
cdata_size = size(frame.cdata); 
data = uint8(zeros(ceil(cdata_size(1)/4)*4,ceil(cdata_size(2)/4)*4,3)); 
data(1:cdata_size(1),1:cdata_size(2),1:cdata_size(3)) = [frame.cdata]; 
frame.cdata = data; 
vidObj = addframe(vidObj,frame); 
end 
vidObj = close(vidObj); 

답변

1

프레임 데이터의 경우 rgb2gray을 사용하여 컬러 프레임을 그레이 스케일로 변환하십시오. 이 두 라인에

data(1:cdata_size(1),1:cdata_size(2),1:cdata_size(3)) = [frame.cdata]; 

: 따라서,이 줄을 변경

frameGray = rgb2gray(frame.cdata); 
data(1:cdata_size(1),1:cdata_size(2),1:cdata_size(3)) = ... 
    cat(3,frameGray,frameGray,frameGray); 

단일 채널의 그레이 스케일 이미지로 색상 프레임을 변환합니다 새로운 코드의 첫 번째 줄. 컬러에서는 회색 음영 이미지가 모든 채널에 대해 동일한 값을 가지므로 두 번째 라인의 경우 cat(3,frameGray,frameGray,frameGray);이 호출됩니다. 이렇게하면 3 장의 그레이 스케일 이미지가 3D 매트릭스로 서로 겹쳐져 있으며이 프레임을 파일에 쓸 수 있습니다.

당신은 VideoWriter을 사용하여 파일에 프레임을 쓸 때 때문에 스택을 할 필요가, 프레임은 (3 차원 매트릭스 일명) 색상해야합니다. 이와 같이 회색 음영 프레임을 파일에 쓰려면 회색, 녹색 및 파란색 채널 각각에 회색 음영 이미지를 복제하여 동등한 색상을 만들어야합니다. cdata 구조가 항상 3D 행렬을 반환 getframe의로

BTW, cdata_size(3)항상은 3 할 것이다.

행운을 빈다.

+0

@NitsornWongsajjathiti - 안녕하세요. 왜 내 대답을 받아들이지 않았 니? 이 작동하지 않았나요? – rayryeng

+0

죄송합니다! 그건 실수 였어. –

+0

@NitsornWongsajjathiti - 문제 없습니다! 그냥 궁금 해서요. 수정 주셔서 감사합니다 :) – rayryeng