요즘 회사가 바쁘다 보니 글을 작성하기가 쉽지가 않다. 더군다나 고향집에 인터넷 설치하고 이것 저것하느라 그래서 오늘은 한편 제대로 써야지 하고 했는데...

     

    놀았다..

     

      이러면 안되는데 가야할 길이 한참 남았는데 말이다. 그래서 OpenCV로 간단하게 웹카메라 영상을 출력하는 예제를 작성하고 테스트 하는 방법을 알아보도록 하자. 

     

    --- 목차 ----------

    1. 라즈베리파이 4/400 OpenCV 4.6.0 설치 : https://makeutil.tistory.com/207

    2. 이미지 파일 출력 (png, jpg, bmp) : https://makeutil.tistory.com/212

    [현재 글] 웹카메라를 이용한 영상 출력 : https://makeutil.tistory.com/220 

    4. 웹카메라를 이용한 영상 저장 : https://makeutil.tistory.com/221 

    5. 웹카메라로 저장한 미디어파일(.mp4) 출력 : https://makeutil.tistory.com/222 

    --------------------

     

      필자도 18년전에 웹카메라를 이용해서 사물 추적하는 프로젝트를 진행한 적이있다. 당시에는 OpenCV나 이런걸 사용하지도 않았으며, 리눅스에서 V4L(Video For Linux)과 SDL(Simple Directmedia Library)를 이용하고, 논문을 참고해서 만들었었는데 프로그래밍 과정자체가 정말 어려웠다. 일단 리눅스에서 개발을 해야되고, V4L에 대한 공부를 해서 카메라 겨우 붙히고, SDL을 이용해서 화면에 출력하는데 까지도 자료가 거의 없었다. 게다가 원하는 기능을 구현하기 위해서 액츄에이터 뿐만 아니라 영상처리까지 배워야 되니까 정말 힘들었지만, OpenCV를 이용하면 정말 손쉽게 구현이 가능하다. 물론, 필자가 임베디드를 처음 배웠을 때 당시의 하드웨어 성능과 지금 우리가 사용하는 라즈베리파이의 성능은 비교 대상 자체가 되지 못한다. 32비트 싱글코어 200/400Mhz의 임베디드 프로세서 8M/16M RAM을 가징 장비와 쿼드코어 64비트 1.2~1.5Ghz 2/4/8GByte의 장비는 비교가 되지 못할 수 밖에 없다. 뭐 어쨋거나 독자분들이 극한의 하드웨어 시스템을 사용하지 않는이상 카메라의 로우데이터(RAW Data)를 사용할 일은 거의 없겠지만, 시간나는 독자들은 별도로 공부해 보는 것을 추천 드린다. 

     

    1. 준비하기

    1.1. 카메라 구입하기

      당연히 라즈베리파이에 OpenCV가 설치되어있어야 된다. 그리고 시중에서 판매되는 저가 또는 적당한 USB 웹 카메라를 구매하여 라즈베리파이에 연결해준다. 그리고 독자 여러분들은 별도로 다른 설정을 할 필요가 없다. 좀더 정확하게 구매하고 싶다면, 웹카메라를 구매할 때 UVC(USB Video Class)를 지원하는지 확인하면된다. 물론, 새로나온 이미지 칩을 이용하는 경우 지원되지 않을 수 있지만, 대부분의 저가형 카메라가 UVC를 지원한다면 상관없이 사용할 수 있다. 혹은 정말 확실하게 확인하고 싶다면 "커널 설정 > 디바이스 > 멀티미디어 > USB 카메라" 정도의 위치에서 USB 카메라 리스트를 확인할 수 있다. 

     

    1.2. 시스템 연결 확인

    1.2.1. /dev 디렉터리에서 장치 연결 확인

      라즈베리파이에 USB웹 카메라를 연결하연 시스템에서는 다양한 메시지로 카메라가 연결되었음을 알려주게된다. 우선 장치들의 연결 노드가 생성되는 /dev/디렉터리에서 video로 시작되는 장치를 확인한다. 

     

    1) 카메라 연결 전

      우선 장치가 연결되지 않은 상타에서 video 장치를 확인해 보자.

    이미 몇몇 장치가 설정되어있음을 알수 있다. 아직 카메라 연결전이므로 저 장치들이 USB카메라일 가능성이 없다.

    그리고 연결 한상태에서 확인해보자.

      video0과 1이 생성되었다. 일반적으로 하나의 장치만 연결되었을 땐 video0만 나오지만 여러 기능이 있는경우 나눠질 수 있다. 그럼 리눅스에서는 해당 장치에 연결하기 위해서 video0또는 1을 이용해서 직접 확인해야 된다. 

    video0과 1이 추가됨.

     

    2) 카메라 연결 후

      메시지에 보면 벤더와 프로덕트 번호가 나오고 웹 카메라가 연결 되었음을 확인할 수 있다. 확실히 예전과는 다르게 장치 번호는 확인되지 않는다. 일부 디바이스 또는 커널에서는 표시되지 않을 수 있다. 

     

    1.2.2. 시스템 메시지를 통한 확인 

      라즈베리파이에 카메라를 연결하지 않은 상태에서 dmesg를 확인해보자. dmesg는 시스템의 상태를 출력한다. 따라서 시간에 따라 다양한 메시지가 저장되지만, 시스템 자체의 많은 변화가 있다면 확인하기가 쉽지 않은 경우가 있다. 그런경우에는 dmesg 명령과 grep을 필터를 이용해서 확인하면 다소 편리하게 사용할 수 있다.

    1) 카메라 연결 전 

      아래의 그림은 카메라 연결정의 상태이다. video라는 장치가 여러개가 보인다. 시스템에서 사용하는 video 장치로 필자도 딱히 어떤 용도로 등록했는지.. 관심없다.

    프로세서(BCM)에서 기본적으로 등록하는 카메라 노드와 코덱등이 등록하는 노드등이 미리 설정되어있다.

    2) 카메라 연결 후

      메시지에 보면 벤더와 프로덕트 번호가 나오고 웹 카메라가 연결 되었음을 확인할 수 있다. 확실히 예전과는 다르게 장치 번호는 확인되지 않는다. 일부 디바이스 또는 커널에서는 표시되지 않을 수 있다. 

    몇번으로 붙었는지 확인은 되지 않는다. 아니면 필자의 눈이 안좋거나 말이다. 장치가 인식된 것만 확인되었다.

     

    2. 소스확인

      opencv의 웹카메라 소스는 아주 많은 곳에 널려있다. 물론, 필자가 사용할 소스도 그러한 소스이다. 당연히 필자는 거기서 끝내지 않을 거고, 좀더 다양한 예시를 독자분들께서 필요할 때 찾아볼 수 있도록 할 것이다. 

    #include <opencv2/opencv.hpp>

    int main(int argc, char** argv)
    {
        cv::VideoCapture cap(0); // 카메라 모듈에 연결된 첫 번째 카메라를 사용.

        if (!cap.isOpened()) {
            std::cout << "카메라를 장치를 사용할수 없다." << std::endl;
            return -1;
        }

        cv::Mat frame;   // 프레임 처리를 위한 저장공간(Mat 객체)할당.

        while (true) 
        {
            cap.read(frame); // 프레임을 읽는다

            // 만약, 데이터가 없다면 - 이 경우는 대부분 NULL상태일 경우이다.
            if (frame.empty())   
            {  
                std::cout << "프레임을 읽을 수 없습니다." << std::endl;
                break;
            }

            // 화면에 윈도우를 만들고 카메라로 부터 받은 영상을 출력한다.
            cv::imshow("Camera Viewer", frame);

            if (cv::waitKey(1) == 'q') {    // 사용자가 q를 터미널에 입력하면 종료한다.
                break;
            }
        }

        cap.release(); // 연결했던 카메라를 닫는다.
        cv::destroyAllWindows(); // 표시를 위해서 생성된 윈도우등 리소스를 반환한다.

        return 0;
    }

      

    3. 컴파일 및 결과 확인

    3.1. 컴파일

      소스코드가 작성되었으면 터미널에서 아래와 같이 입력하여 컴파일 한다. 만약, 오류 이외에 라이브러리 설치와 관련된 경고 또는 abort가 발생된다면 OpenCV 시리즈의 Opencv 설치편을 먼저 확인하고 계속 진행한다.

    $ g++ -o opencv_cam opencv_cam.cpp $(pkg-config opencv4 --libs --cflags)

      

    3.2. 실행결과

      정상적으로 빌드가 되었다면 실행해보자. 

    $ ./opencv_cam

      

    결과는 다음과 같이 확인된다.

     

      자! 아주 간단한 코드 몇 줄로 훌륭히 카메라의 영상을 수집해 보았다. 이 카메라 예제는 이후에 여러분들이 필자와 함께 한다면 아주 다양하게 어렌지하여 사용하게 될 것이다. 시스템 성능이 좋아지다보니 OpenCV로 여러분들이 할수 있는 것들이 아주 많다. 특히 대학생 독자들께서는 졸작이나 학교내/외의 대회등 다양한 과제/프로젝트/졸작에 이용할 수 있는 아이템이니까 말이다. 

     

    즐거운 주말 되시길 바란다. 

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기