주요 콘텐츠

이 페이지는 기계 번역을 사용하여 번역되었습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

getsnapshot를 사용하여 루프에서 단일 이미지 수집

이 예제에서는 getsnapshot 함수를 사용하는 방법을 보여줍니다. 단일 비디오 프레임을 빠르게 수집하려면 getsnapshot 함수를 사용하세요.

수집 객체 설정

Image Acquisition Toolbox™와의 대부분의 상호작용은 비디오 입력 객체를 통해 이루어집니다. 이러한 객체는 videoinput 명령으로 생성됩니다. 이 예제에서는 winvideo 어댑터를 통해 액세스하는 웹캠을 사용합니다.

vidobj = videoinput('winvideo')
Summary of Video Input Object Using 'Microsoft® LifeCam Cinema(TM)'.

   Acquisition Source(s):  input1 is available.

  Acquisition Parameters:  'input1' is the current selected source.
                           10 frames per trigger using the selected source.
                           'YUY2_1280x720' video data to be logged upon START.
                           Grabbing first of every 1 frame(s).
                           Log data to 'memory' on trigger.

      Trigger Parameters:  1 'immediate' trigger(s) on START.

                  Status:  Waiting for START.
                           0 frames acquired since starting.
                           0 frames available for GETDATA.

이 카메라의 디폴트 비디오 포맷이 YUY2_1280x720이므로 이미지는 YCbCr 컬러스페이스로 반환됩니다. ReturnedColorSpace 속성 값을 지정하여 컬러스페이스를 rgb로 변경합니다.

vidobj.ReturnedColorSpace = "rgb";

프레임 수집

단일 프레임을 얻으려면 getsnapshot 함수를 사용하세요.

snapshot = getsnapshot(vidobj);

프레임을 도형 창에 표시합니다.

imagesc(snapshot)

여러 프레임 수집

일반적인 작업 중 하나는 단일 이미지를 반복적으로 수집하고, 이를 처리한 다음 결과를 저장하는 것입니다. 이렇게 하려면 루프에서 getsnapshot를 호출합니다.

for i = 1:5
    snapshot = getsnapshot(vidobj);
    imagesc(snapshot);
end

타이밍 의미

getsnapshot 함수는 호출되면 많은 작업을 수행합니다. 장치에 연결하고, 장치를 구성하고, 수집을 시작하고, 한 프레임을 수집하고, 수집을 중지한 다음 장치를 닫아야 합니다. 즉, 하나의 프레임을 수집하는 데 예상했던 카메라의 프레임 속도보다 훨씬 더 오랜 시간이 걸릴 수 있다는 의미입니다. 이를 설명하기 위해 루프에서 getsnapshot를 호출해 보겠습니다.

20개의 프레임을 수집하는 데 걸리는 시간을 측정합니다.

tic
for i = 1:20
    snapshot = getsnapshot(vidobj);
end

elapsedTime = toc
elapsedTime = 0.9685

프레임당 시간과 효과적인 프레임 속도를 계산합니다.

timePerFrame = elapsedTime/20
timePerFrame = 0.0484
effectiveFrameRate = 1/timePerFrame
effectiveFrameRate = 20.6510

다음 예는 루프를 수행하는 더 효율적인 방법을 보여줍니다.

수동 트리거 모드 사용

이전 설정에서 설명한 getsnapshot의 오버헤드를 피하려면 videoinput 객체의 수동 트리거 모드를 사용하면 됩니다. 수동 트리거 모드를 사용하면 툴박스가 메모리에 데이터를 기록하지 않고 한 번만 장치에 연결하고 장치를 구성할 수 있습니다. 이는 프레임을 더 짧은 지연으로 MATLAB®으로 반환할 수 있음을 의미합니다.

객체를 수동 트리거 모드로 구성합니다.

triggerconfig(vidobj, 'manual');

이제 장치가 수동 트리거에 맞게 구성되었으므로 start를 호출합니다. 이렇게 하면 장치가 MATLAB로 데이터를 다시 전송하지만 이 시점에서는 프레임을 메모리에 기록하지 않습니다.

start(vidobj)

20개의 프레임을 수집하는 데 걸리는 시간을 측정합니다.

tic
for i = 1:20
    snapshot = getsnapshot(vidobj);
end

elapsedTime = toc
elapsedTime = 0.7926

프레임당 시간과 효과적인 프레임 속도를 계산합니다.

timePerFrame = elapsedTime/20
timePerFrame = 0.0396
effectiveFrameRate = 1/timePerFrame
effectiveFrameRate = 25.2339

stop 함수를 호출하여 장치를 중지합니다.

stop(vidobj)

수동 트리거를 사용하면 경과 시간이 이전 예보다 훨씬 짧은 것을 볼 수 있습니다.

정리

비디오 입력 객체가 더 이상 필요하지 않으면 관련 변수를 삭제합니다.

delete(vidobj)