문제 설명을 읽으면 이전 프레임과 현재 프레임 사이의 프레임 차이 (회색 음영)를 원할 수 있습니다. 여러분이 할 수있는 것은 첫 번째 프레임을 임시 변수로 저장 한 다음 루프의 for
루프에서 현재 프레임과 이전 프레임의 차이를 취하는 것입니다. 다음 프레임으로 반복하기 전에이 현재 프레임을 이전 프레임으로 설정 한 다음 계속 진행하십시오. 물론, 당신은 당신이 읽고 각 프레임의 그레이 스케일 동등한를 작성해야 따라서, 당신은이에 for
루프를 변경해야합니다.
prevFrame = rgb2gray(vidFrames(:,:,:,1)); %// Initialize and get grayscale
for k = 2 : numFrames %// Note we start at index 2
currFrame = rgb2gray(vidFrames(:,:,:,k)); %// Get current frame
%// and get grayscale
%// Find difference frame
diffFrame = uint8(abs(double(currFrame) - double(prevFrame)));
mov(k).cdata = cat(3,diffFrame,diffFrame,diffFrame); %// Now save to file
mov(k).colormap = [];
imagename=strcat(int2str(k), '.jpg');
%//save inside output folder
imwrite(mov(k).cdata, strcat('output\frame-',imagename));
prevFrame = currFrame; %// Save for next iteration
end
내가 차이 프레임을 계산하는 방법에 특별한주의를 기울이십시오. 각 프레임을 double
으로 캐스팅 한 다음 절대 차이를 취한 다음 uint8
으로 다시 그립니다. 그 이유는 네가 이렇게하지 않으면 네거티브 차이가있는 픽셀이 있으면 MATLAB은이 차이를 0으로 포화시킬 것입니다. 예를 들어, 한 픽셀이 한 프레임의 강도 128이고 다음 픽셀이 255 인 경우 차이는 -127이어야합니다. abs
은 실제로 127의 차이이기 때문에 여기에 넣습니다. 어떤 방향으로 갈지는 중요하지 않습니다. 그러나 MATLAB은이 차이를 0보다 작은 값이 0으로 포화되면 0으로 간주합니다. 파일에서 읽은 프레임이 uint8
일 가능성이 높으므로 두 프레임을 모두 double
으로 변환해야합니다. 절대 차이를 찾으면 uint8
으로 다시 작성하여 파일에 저장하고 원하는 경우 이러한 이미지를 표시 할 수 있습니다.
이제 코드는 차이 이미지를 파일로 저장합니다. 프레임 2에서 시작 했으므로 한 프레임 짧을 것입니다. 이는 연속 프레임 간의 차이를 비교하려는 경우 필요합니다. 프레임을 만들 때, 차이 프레임을 복제하고 RGB 프레임을 모방하는 3 개의 채널로 만들어야했습니다. 회색 음영 이미지의 경우 RGB는 각 채널이 모두 동일하게됩니다. 이 명령은 cat
명령을 사용하여 완료되었으며 세 번째 차원에서 차이 프레임을 세 번 누적했습니다.
이제 mov
구조체에 대해 좋은 점은이 구조체를 사용하고 예를 들어 MATLAB의 클래스를 사용하여이 구조체를 사용하여 비디오를 만들 수 있다는 것입니다. 구조체는 파일에 쓰도록 정확하게 형식이 지정됩니다. 간단히 구조를 반복하고 각 구조 요소를 VideoWriter
클래스 파일에 작성하십시오. 그러면 연속 프레임 간의 차이를 보여주는 동영상을 제작할 수 있습니다.