OpenCV RTSP 영상읽기 with C++


파이썬으로 작성하려고 했으나

좀더 테스트가 필요한 상황

C++과 동일한 코드임에도 동작하지 않고 있다.


해결할 수 있는 방법은 좀더 찾아봐야 할 것 같고

일단 이번엔 C++을 기반으로 영상읽기에 대한 간단하게 설명해 보자.



  1. #include <opencv/cxcore.h>
  2. #include <opencv/highgui.h>

  3. int main(int ac, char *av[])
  4. {
  5.       // 휴바이론 ND821 h.264 640x480
  6. cv::Ptr<CvCapture> capture = cvCaptureFromFile("rtsp://admin:admin@192.168.1.30:554/stream2");

  7. cv::namedWindow("KnVision");
  8. for(;;)
  9. {
  10. cv::Mat frame = cvQueryFrame(capture);
  11. cv::imshow("KnVision", frame);

  12. if(cv::waitKey(1) >= 0)
  13. break;
  14. }
  15. }


위의 코드는 구글링으로 발견한 어느 세미나 자료에서 본 샘플 코드를 기반으로 작성한 코드인데

국내 블러거 분들이 올린 소스코드에서도

유사한 코드가 있긴 했었다.


http://blog.daum.net/99cassiopeia/9 <--- 이 코드는 위의 코드와 유사함

http://blog.daum.net/pg365/195 <--- 여기 블러그에 소개된 코드는 VideoCapture를 이용한 방식인데 영상이 재생되진 않음


C++로 작성하니 좀 더 명확한 부분이 보인다.


이 코드에서 사용한 함수들은 모두 highgui 라이브러리 모듈을 참조하는 함수들이다.

http://docs.opencv.org/modules/highgui/doc/highgui.html

따라서, 컴파일/링크할 때 코어라이브러리와 함께 highgui 라이브러리를 포함시켜 링크를 해줘야 하고

실행 시 opencv_highgui.dll 을 참조하게 된다.


소스코드는 간단하기 때문에 라인번호로 설명하겠다.


7번라인 : cvCaptureFromFile 를 이용해 스트림을 오픈한다.

(rtsp 주소는 해당 카메라의 설정부분에서 확인이 가능하다)

# h.264가 아닌 코덱을 사용했을 경우 에러와 함께 재생되지 않고 있다.

# 이것도 확인이 필요한 사항


이때 리턴되는 객체는 VideoCapture 함수와는 다른 CvCapture 로 돌려받는다.


9번라인 : 받아온 영상을 출력하기 위한 namedWindow를 생성한다.

10번라인 : 무한루프 루틴

12번라인 : cvQueryFrame함수를 이용해  CvCapture 객체의 화면을 Mat 자료형으로 받아온다.

13번라인 : namedWindow로 생성한 윈도우에 캡쳐한 영상을 출력한다.


15번라인 : 항상 잊지말아야할 waitKey함수 -1 일때가 입력이 없는 상태이다.


이 소스코드 원본에 destroyWindow 가 없어 같이 생략했었는데

다른 일반적인 윈도우 프로그램과 마찬가지로 인스턴스가 종료될때 같이 종료되는 것 같다.

별도의 이벤트 핸들러를 사용하는 게 아니라면 생략해도 무방하겠지만

실제 프로그램에선 종료확인등을 이벤트핸들러로 사용하게 될 가능성이 높으니

가능하면 습관적으로 입력해 두는 것이 좋을 듯 하다.


Posted by 휘프노스
,