ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OpenCV 강좌 - 2 . 동영상 다루기
    OpenCV/OpenCV C++ 강좌 2019. 6. 26. 14:35

     

     

    OpenCV에서 웹캡 영상을 캡쳐하고 화면에 보여준 후 저장하는 방법을 다룹니다.

     

     

     

    1. 카메라로부터 영상 가져오기

    #include <opencv2/core.hpp>
    #include <opencv2/videoio.hpp>
    #include <opencv2/highgui.hpp>
    //#include <opencv2/imgproc.hpp> // for cvtColor
    
    #include <iostream>
    
    
    using namespace cv;
    using namespace std;
    
    
    int main()
    {
    
    	Mat frame;
    
    	VideoCapture cap(0);
    	if (!cap.isOpened())
    	{
    		cerr << "카메라를 열 수 없습니다." << endl;
    		return -1;
    	}
    
    	while(1)
    	{
    		cap.read(frame);
    		if (frame.empty())
    		{
    			cerr << "캡쳐 실패" << endl;
    			break;
    		}
    
    		//cvtColor(frame, frame, COLOR_BGR2GRAY);
    
    		imshow("Live", frame);
    
    		if (waitKey(1) >= 0)
    			break;
    	}
    
    
    	return 0;
    }

     

     

    2. 카메라로부터 캡처한 영상을 동영상 파일로 저장하기

    #include <opencv2/core.hpp>
    #include <opencv2/videoio.hpp>
    #include <opencv2/highgui.hpp>
    //#include <opencv2/imgproc.hpp> // for cvtColor
    
    #include <iostream>
    
    
    using namespace cv;
    using namespace std;
    
    
    int main()
    {
    
    	Mat frame;
    
    	VideoCapture cap(0);
    	if (!cap.isOpened())
    	{
    		cerr << "카메라를 열 수 없습니다." << endl;
    		return -1;
    	}
    
    	int fps = 30;
    	int width = cap.get(CAP_PROP_FRAME_WIDTH);
    	int height = cap.get(CAP_PROP_FRAME_HEIGHT);
    	int fourcc = VideoWriter::fourcc('M','J','P','G');
    
    	VideoWriter outputVideo;
    	outputVideo.open("output.avi", fourcc, fps, Size(width, height), true);
    
    
    	while(1)
    	{
    		cap.read(frame);
    		if (frame.empty())
    		{
    			cerr << "캡쳐 실패" << endl;
    			break;
    		}
    
    		//cvtColor(frame, frame, COLOR_BGR2GRAY);
    
    		imshow("Live", frame);
    
    		outputVideo.write(frame);
    
    		if (waitKey(1) >= 0)
    			break;
    	}
    
    	outputVideo.release();
    
    	return 0;
    }

     

     

     

    3. 동영상 파일로부터 영상 가져오기

    #include <opencv2/core.hpp>
    #include <opencv2/videoio.hpp>
    #include <opencv2/highgui.hpp>
    
    #include <iostream>
    
    
    using namespace cv;
    using namespace std;
    
    
    int main()
    {
    
    	Mat frame;
    
    	VideoCapture cap("output.avi");
    	if (!cap.isOpened())
    	{
    		cerr << "카메라를 열 수 없습니다." << endl;
    		return -1;
    	}
    
    
    	while(1)
    	{
    		cap.read(frame);
    		if (frame.empty())
    		{
    			cerr << "캡쳐 실패" << endl;
    			break;
    		}
    
    
    		imshow("Live", frame);
    
    		if (waitKey(30) >= 0)
    			break;
    	}
    
    
    	return 0;
    }

     

    포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
    댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

    여러분의 응원으로 좋은 컨텐츠가 만들어집니다. 지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

    유튜브 구독하기


    댓글 16

    • 사이버스 2019.07.02 14:07


      영상 나오는 윈도우 크기를 줄일려면 어떻게 하나요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.02 14:40 신고


        resize 함수를 사용하여 이미지를 축소하면됩니다.

        자세한 내용은 아래 링크를 참고하세요

        https://076923.github.io/posts/Python-opencv-8/

    • 사이버스 2019.07.02 16:53


      전 c++ 쓰고 있는데 파이선에서 어떻게 바꿔야하는지를

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.02 17:36 신고


        파이썬에서 동영상을 다루고 싶은 건가요?

        아래 포스트를 참고하세요

        OpenCV Python 예제 - 동영상 다루기
        https://webnautes.tistory.com/577

    • 사이버스 2019.07.02 17:41


      그게 아니라 알려주신건 파이선 코드 나온거였는데
      전 c++로 쓰고있어서요

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.07.02 18:56 신고


        아.. 반대로 이해했네요..

        아래 링크를 참고하세요.
        https://cinema4dr12.tistory.com/732

        파이썬으로 알려드린게 옵션 설명이 잘 나와있으니 같이 참고하세요.

    • 감사합니다 2019.08.30 14:37


      Waitkey에 대해서 궁금한점이 있습니다.

      waitkey는 키보드 입력이 들어왔을 때 동작을 해서 조건문에 맞으면 프로그램을 중단하는 역할로 알고 있었는데

      waitkey(n)에서 n의 숫자가 클 수록 영상 재생 속도가 느려지더라구요 1로하니까 기존 재생속도랑 거의 비슷하게 되는거 같습니다.

      이유가 뭔지 질문드리고 싶어 댓글 남깁니다.

    • dani 2019.11.15 21:40


      grayscale로 이미지화했을때 동영상 저장할때 error 메세지를 자꾸 출력해서 -1을 fourcc로 변경했고, grayscale도 처리안하고 원색에서 했더니 되네요..왤까요ㅠㅠ
      그리고 fourcc에서 ('x','v','i','d') 이거랑 ('m','j','p','g')의 차이가 화질차이인가요?
      fourcc랑 제 문제(grayscale에서 동영상 저장은 되는데 재생이 안되는 거)는 관련이 없겟죠?

      오늘 보기 시작했는데, 강의 잘 듣고 영상처리하는 프로젝트 스스로 해보도록 할게요 감사합니다!

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.16 18:07 신고


        그레이스케일로 저장하려면 추가 옵션이 필요한데 지금 자료를 찾아볼수 없네요. cvtColor함수의 인자로 COLOR_GRAY2BGR을 사용해도 저장이 가능해집니다.

    • win32 2019.11.18 01:10


      안녕하세요. 먼저 감사합니다. 강좌 이해하기 쉽고 재밌게 잘 보고 있습니다.

      1번 예제 "카메라로부터 영상가져오기"에 대한 질문입니다.

      Win32 Project에서 작성할 경우 기본 윈도우창이 뜨고 그다음 OpenCV에서 만든 윈도우창이 출력됩니다.

      하지만 제가 하고 싶은 것은 Win32 GUI(기본 윈도우)창에 OpenCV 카메라 영상을 출력하고 싶은데 이와 관련한

      강좌가 보이지 않습니다. 도움이 필요합니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.18 09:05 신고


        OpenCV의 이미지를 비트맵으로 변환하여 Win32 API에서 화면에 보여주면 될듯합니다.


        MFC로 한 강좌는 있습니다.

        OpenCV와 MFC 연동해서 웹캠 영상을 출력하기
        https://webnautes.tistory.com/824

    • win32 2019.11.18 14:19


      빠른 답변 감사드립니다.

      MFC로 한 강좌는 이미 봤습니다. (복잡해서 훑어만 보았지요...)

      제가 Win32 DLL을 만드는데 목적이 있는데, "OpenCV와 MFC 연동해서 웹캠 영상을 출력하기" 프로젝트를 win32에서 작업해봐야 겠습니다.

    • 오린이 2019.11.28 23:47


      안녕하세요 최근 opencv를 공부하기 시작한 사람입니다. 위 코드를 그대로 붙여넣었는데 카메라가 순간적으로 켜졌다가 꺼지는데 왜이러는걸까요

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.29 08:25 신고


        영상이 보였다면 카메라랑 연결은 된듯합니다.

        혹시 캡쳐 실패 라는 메시지가 보이지 않았나요?


        그랬다면 아래 코드 부부에서 break를 제거하고 해보세요

        if (frame.empty())
        {
        cerr << "캡쳐 실패" << endl;
        break;
        }

Designed by Tistory.