비디오 코덱

waitKey(30) >= 0 알아보기

케케_ 2024. 11. 27. 17:07

지피티 답변

 

좋은 질문입니다! OpenCV에서 cv::waitKey 함수의 30과 >= 0의 의미를 설명하겠습니다.


cv::waitKey(30)의 의미

cv::waitKey() 함수는 OpenCV에서 다음과 같은 역할을 합니다:

  1. 키 입력 대기 시간:
    • 함수의 매개변수는 밀리초 단위로 키 입력을 대기하는 시간을 지정합니다.
    • 예: 30이면 30밀리초(0.03초) 동안 키 입력을 기다립니다.
  2. 프레임 재생 속도 제어:
    • 대기 시간은 동영상 재생 속도를 조절하는 데 사용됩니다.
    • 일반적으로, 대기 시간은 비디오의 FPS(Frame Per Second, 초당 프레임 수)를 기반으로 계산됩니다:
      • 대기 시간(ms)=1000 / FPS(ms) = 1000 / FPS

예제

  • FPS가 30인 비디오의 경우:
    • 대기 시간(ms)=1000 / 30 ≈ 33.33
    • cv::waitKey(30)로 설정하면 비디오가 적절한 속도로 재생됩니다.
  • FPS가 60인 경우:
    • 대기 시간(ms)=1000 / 60≈16.67
    • 이때는 cv::waitKey(16)을 사용하는 것이 적합합니다.

>= 0의 의미

cv::waitKey()는 대기 시간 동안 키 입력이 발생했는지 확인할 수 있도록 정수 값을 반환합니다:

  • 키 입력이 없으면 **-1**을 반환.
  • 키가 입력되면 해당 키의 ASCII 값을 반환.

조건: >= 0

  • >= 0는 키가 입력되었는지 확인하는 조건입니다.
  • 입력된 키가 있으면 루프를 종료하거나 특정 작업을 수행할 수 있습니다.

코드에서의 역할

if (cv::waitKey(30) >= 0) break;
  1. 30:
    • 30밀리초 동안 키 입력을 기다립니다.
    • 이 시간 동안 아무 키도 입력되지 않으면 루프는 계속 실행됩니다.
  2. >= 0:
    • 특정 키가 입력되었는지 확인.
    • 키 입력이 있으면 조건이 참이 되어 break로 루프를 종료합니다.

왜 이런 조건을 쓰는가?

  1. 루프를 제어:
    • 키 입력이 있을 때만 루프를 종료하도록 제어.
    • 예: Esc 키를 누르면 루프를 빠져나오도록 설정.
  2. 사용자 상호작용:
    • 사용자가 키보드로 비디오 재생을 제어할 수 있습니다.

실제 예제: Esc 키로 종료

키 입력을 통해 비디오 재생 루프를 종료하는 예제입니다:

while (true) {
    cv::Mat frame;
    cap >> frame; // 다음 프레임 읽기
    if (frame.empty()) break;

    cv::imshow("Video", frame);
    if (cv::waitKey(30) == 27) break; // '27'은 ESC 키의 ASCII 값
}
  • cv::waitKey(30) == 27:
    • 사용자가 ESC 키(ASCII 값 27)를 누르면 break로 루프 종료.

정리

30의 의미

  • cv::waitKey(30)은 30밀리초 동안 키 입력을 기다리고, 비디오의 프레임 재생 속도를 조절합니다.

>= 0의 의미

  • cv::waitKey() 함수가 반환한 값이 0 이상이면 키가 입력된 것으로 간주하며, 루프를 종료하거나 특정 동작을 수행합니다.

추가적인 활용이나 다른 질문이 있으면 언제든 말씀해주세요! 😊