2014-09-06 2 views
-2

다음 작업을 수행하는 함수를 작성합니다. 비디오에서 추출하고 프레임을 회색 음영으로 변환하고 추출한 처음 두 이미지의 차이를 계산합니다.비디오에서 이미지를 추출하고 그레이 스케일로 변경하고 차이점을 찾으십시오.

나는이 시점까지 코드를 작성했다. 하지만 이전에 추출한 이미지를 추출하는 방법을 모릅니다. 누구든지 이것에 대한 지침을 제공 할 수 있습니까?

function [ vid ] = motion(input_args) 

vid = (input_args); 
readerobj = VideoReader(vid); 
vidFrames = read(readerobj); 

numFrames = get(readerobj, 'Number of Frames'); 

for k = 1 : numFrames  
    mov(k).cdata = vidFrames(:,:,:,k);  
    mov(k).colormap = [];  
    imagename=strcat(int2str(k), '.jpg');  
    %save inside output folder  
    imwrite(mov(k).cdata, strcat('output\frame-',imagename));  
end 

end 

답변

0

문제 설명을 읽으면 이전 프레임과 현재 프레임 사이의 프레임 차이 (회색 음영)를 원할 수 있습니다. 여러분이 할 수있는 것은 첫 번째 프레임을 임시 변수로 저장 한 다음 루프의 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 클래스 파일에 작성하십시오. 그러면 연속 프레임 간의 차이를 보여주는 동영상을 제작할 수 있습니다.